【问题标题】:Does a function that receives a function as a parameter can still be considered a pure function?接收函数作为参数的函数是否仍然可以被视为纯函数?
【发布时间】: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)

我的疑问来自...纯度是否定义为函数所做的事情,不包括作为参数传递的外部调用发生的任何事情?

否则,由于高阶函数是函数式编程的主题......难道不考虑调用因素就无法将函数本身分类为纯函数吗?

【问题讨论】:

标签: javascript


【解决方案1】:

我认为这取决于getVat()。如果getVat() 是纯的addVat() 也是纯的:)

【讨论】:

  • 但是getVat 是一个参数,可以是任何东西。那么你的意思是我们不能对addVat 说任何事情,除非查看具体的电话?
  • 我认为是的,因为这个特定的调用取决于 getVat() 实现。如果 const getVat = ()=> Math.random() 返回 10 在我看来 addVat() 是纯的,因为它为相同的参数集返回相同的值。
【解决方案2】:

Javascript 语言不强制执行纯度,因此无法保证调用作为参数传递的函数的函数的纯度。这个thread 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2012-01-12
    • 2022-01-08
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多