【发布时间】:2021-10-25 03:28:59
【问题描述】:
addVat 是纯函数吗?
function addVat(country, getVat, amount)
{
if(amount > 0) {
return amount + getVat(country)*amount
}
return amount
}
有一个函数作为参数 - getVat - 使 addVat 自动不纯?
根据 getVat 的实现,我们可能会引入任何副作用... getVat 可能会返回一个随机值,从而使 addVat 的结果不可预测。
const getVat = ()=> Math.random()
addVat('UK',getVat, 20)
产生外部副作用的案例...
const getVat = ()=> {
updateDbWithVatUsed(0.2)
return 0.2
}
addVat('UK',getVat, 20)
另一方面,单元测试是可行的,因为副作用或数据可变性超出了纯函数的范围,我们可以将其存根以使测试完全可预测。
const getUKVat = ()=> 0.2
assert.equal(addVat('UK',getUkVat, 20), 24)
我的疑问来自...纯度是否定义为函数所做的事情,不包括作为参数传递的外部调用发生的任何事情?
否则,由于高阶函数是函数式编程的主题......难道不考虑调用因素就无法将函数本身分类为纯函数吗?
【问题讨论】:
-
"纯度定义为函数所做的不包括其他任何事情" - 是的。请记住,纯粹性和引用透明性只是帮助我们推理代码的抽象,因此您应该采用使它们更有用的假设。抽象总是在某种程度上分解,无论是identity 还是side effects
-
@Bergi 作为 Javascript 一种非功能性语言,我喜欢您所解释的实用主义。如果您查看功能架构问题,我将不胜感激:stackoverflow.com/q/69700611/12625403
标签: javascript