gpt4 book ai didi

function - "Side-effecting lexical closure"vs Scala 中的函数

转载 作者:行者123 更新时间:2023-12-02 22:08:46 25 4
gpt4 key购买 nike

his answer's comment section , Apocalisp 声明如下:

Well, you did ask for a function. A side-effenting [sic] lexical closure is emphatically not a function.



他所说的“副作用词法闭包”到底是什么意思,这与函数有什么不同?

我的猜测是,他们试图从函数式编程的意义上区分函数——不允许有副作用(例如改变变量的状态或输出值),而纯粹的过程确实有副作用。

如果是这样的话,那么 Scala 是自己做出这种区分的,还是仅仅留给程序员?如果是这样,每个没有副作用的可调用(因为没有更好的术语)都是一个函数,以及每个具有副作用的词法闭包的可调用吗?

最佳答案

闭包只是“自由变量”的定义,以及为这些自由变量提供绑定(bind)的外部环境。在 x + 1 x是一个自由变量;没有定义x是,所以你只能说这个表达式在包含 x 的环境中具有什么值。 .在 y => x + y x仍然是免费的,但 y不是;表达式定义了一个函数,函数的参数是 y 的绑定(bind)。 .

Scala 上下文中的“词法闭包”基本上只是一个“闭包”(因为它的所有闭包都是词法的),但从技术上讲,“闭包”是一个更一般的概念。 “关闭”本身并没有说明环境从何而来; “词法闭包”指定闭包定义的词法范围(即它在源代码中出现的位置)决定了环境。

所以“副作用的词汇闭包”只是其中之一,它有副作用。

我对此评论的看法是,Apocalisp 将函数的数学思想与要执行的参数化代码块的编程思想进行了对比。不管他是不是这么想的,我都会扩展我的想法:

在数学中,函数基本上只是从某些输入集(函数的 )中的值到某些输出集(其 共域 )中的值的映射。在这种观点下,函数不是我们不允许副作用的特殊受限程序形式,“具有副作用”的概念不适用于它。问一个数学函数是否有副作用就像问黄色是否有副作用;甚至“不”的答案也不是真的正确。你对数学函数所能做的就是询问它的 codomain 中的哪个值对应于它的 domain 中的给定值;如果我有 { 1 -> 11, 2 -> 22, 3 -> 33 } 描述的功能我问什么codomain值对应于2,回答“22,对象foo的count属性现在是7”是没有意义的。

在理想化的函数式编程中,我们仅将代码视为定义与我们要定义的函数相对应的映射的一种方式。最有趣的函数是无限的(或者至少是不切实际的庞大),所以我们不是通过写出从输入到输出的文字映射来做到这一点,而是通过写下描述输出如何对应于输入的或多或少的抽象规则来做到这一点。当然,在实践中,我们确实会花费大量时间来考虑我们的代码将如何执行,但通常函数式程序员更愿意首先考虑定义。

另一方面,传统命令式编程中所谓的函数与函数的数学概念几乎没有关系。程序员的函数不是从域中的值到共域中的值的映射,而是一个接一个地执行的一系列步骤(可能由输入值参数化并返回输出值)。这些步骤中的每一个都可能产生影响,因此您不能忽略它们的存在并说这只是定义域-> 共域映射的另一种方式,并且不能独立于它们的上下文将它们作为事物单独检查。

在想要同时支持函数式编程和命令式编程的编程语言中,您使用相同的语言元素来定义数学函数和程序员的函数。或者,如果您专门使用术语函数来指代数学函数,那么您使用相同的语言元素来定义函数和“其他不是函数的东西”。我用 Apolalisp 的短语“词法闭包”来描述 Scala 的函数定义语法除了函数概念之外的定义,当你进一步补充说它是一个“副作用词法闭包”时,它绝对不是你在说的函数关于。

关于function - "Side-effecting lexical closure"vs Scala 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com