【发布时间】:2021-09-05 15:57:24
【问题描述】:
考虑以下python中的代码:
f = λx: x
f = λx: f(x)+1
f(1)
Python 在运行最后一行时抛出一个“无限循环”错误,这在它将第二行解释为 f 的递归公式的方式上很明显。
但是,如果将 f 的“值”替换为右侧的“值”,然后将结果函数分配给 f(在左侧),则第二行似乎是合理的。
是否存在通过 lambda 演算操作在 python(或其他可以处理函数的语言)中修复此错误的直接方法?
我问这个问题只是为了更好地了解函数式语言,但在我看来,答案有助于对函数进行循环计算!
【问题讨论】:
-
说明显而易见的风险:(1)在这两个分配之间添加
g = f,(2)用@替换第二个分配右侧的所有f987654324@。这样,您可以通过中间变量“修复”f的值。在真正函数式语言中,您不会遇到这个问题,因为大多数值是不可变的,因此您不会“重新分配”f。 -
@Heinzi 似乎这在python中不起作用。它在另一个程序中工作吗? (像斯卡拉?)
-
“修复此错误”是什么意思?只是不要写有这个错误的代码吗?您是否正在尝试创建一个检测此类错误的 linter?您是否正在尝试创建一个可以自动将 python 代码重写为您想要的含义的工具?
-
@Mostafa:在这种情况下,
=并不意味着等于。这意味着“将右侧的任何内容存储在左侧的变量中”。一些编程语言使用左箭头代替,这使得这一点更加明确:g ← f。因此,g现在包含您的“旧” lambda 和f新的(比较它与f = 2; g = f; f = 3- 现在 g 包含 2 并且 f 包含 3)。请注意,lambda 使一切变得更加复杂,因为它们创建了“闭包”和“捕获变量”。您可以使用这些搜索词进行进一步研究。
标签: functional-programming lambda-calculus