微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala中的“副作用词汇闭包”与功能

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本身就会做出这种区分,还是只留给程序员呢?如果是这样,每个可调用(缺少一个更好的术语)是没有副作用的函数,还是每个可调用的副作用词汇闭包?

解决方法

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

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

因此,“副作用词汇封闭”只是其中之一,具有副作用.

我对该评论的看法是,Apocalisp将函数的数学概念与要执行的参数化代码块的编程思想进行了对比.无论这是他在想什么,我都会扩展我的想法:

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

在理想化的函数式编程中,我们将代码视为仅仅是一种定义与我们想要定义的函数相对应的映射的方法.最有趣的函数是无限的(或者至少是不切实际的巨大的),所以我们不是通过写出从输入到输出文字映射而是通过写下描述输出如何与输入相对应的或多或少的抽象规则来实现的.当然,在实践中,我们花了很多时间在操作上思考如何执行代码,但通常功能程序员宁愿首先考虑定义.

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

在一种想要支持函数式编程和命令式编程的编程语言中,您使用相同的语言元素来定义数学函数和程序员的函数.或者,如果您专门使用术语函数来引用数学函数,则使用相同的语言元素来定义函数和“其他不是函数函数”.我把Apolalisp的短语“lexical closure”描述为描述Scala的函数定义语法与函数概念的区别,当你进一步补充它是一个“副作用词汇闭包”时,它肯定不是你正在谈论的函数关于.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐