【问题标题】:If a pure function returns an impure function is it pure如果纯函数返回一个不纯函数,它是纯函数吗
【发布时间】:2019-10-05 05:26:00
【问题描述】:

如果一个纯函数返回一个不纯函数是不是纯函数

const fn = endpoint => () => { 
  console.log(endpoint);
}

技术上fn 是不是很纯粹?

【问题讨论】:

  • 这实际上是 IO Monad 的基础。只要您不调用 thunk,一切都会保持纯净(没有参数的乐趣)。现在,为了能够对此做一些有用的事情,您需要 1) 一种将此类函数与另一个(部分应用的)IO 计算相结合的方法 2) 一种允许此类函数使用正常(纯)值的机制。

标签: javascript function ecmascript-6 functional-programming


【解决方案1】:

是的,外部函数是纯函数。除了创建 lambda 所需的后台机制之外,函数的调用不会引起任何副作用(如果计算这些影响,没有函数是纯函数,因为至少调用堆栈被函数改变了称呼)。

您可以将此函数调用替换为它内联返回的函数,并且代码的行为相同。

【讨论】:

  • 我最初把名字弄混了。现已修复。
  • 你能评论我的回答吗?
【解决方案2】:

我不同意@Carcigenicate。如果表达式 f(x) 对于每个引用透明表达式 x 都是引用透明的,则函数 f 是纯函数。 这意味着您可以用一些 VALUE 替换 f(x) 并且程序的可观察行为不会改变。 console.log 并非如此。

这与在 Haskell 中不同,其中 IO 是一个真值,而不是一个副作用声明。

【讨论】:

  • "这意味着你可以用一些 VALUE 替换 f(x) 并且程序的可观察行为不会改变。"这里就是这种情况。您可以用返回的函数替换函数调用,并且行为将是相同的。由于console.log 调用,内部函数肯定是不纯的,但外部函数从不调用内部函数
  • 所以您提议允许条款产生副作用?然后将() => {console.log} 减少到console.log 是非法的。否则 lambda 演算的所有所需属性(这是谈论 RT afaik 的唯一方式)都会丢失。
  • 老实说,我不确定您在前两句话中指的是什么。我是说对fn 的调用可以替换为内联返回的函数() => { console.log(endpoint); },并且程序的行为将是相同的,并且fn 本身不会引起任何副作用。你反对哪一点?
  • 有道理。感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多