如何修复函数式编程语言中"f = lambda x: f(x)+1"的无限循环错误?

How to fix the infinite loop error of "f = lambda x: f(x)+1" in a functional programming language?

考虑 python 中的以下代码:

f = λ x: x

f = λ x: f(x)+1

f(1)

Python 在 运行 最后一行时抛出“无限循环”错误,这在将第二行解释为 f.[=11= 的递归公式的方式上很清楚]

但是如果在右侧替换 f 的 'value',然后将结果函数分配给 f(在左侧),那么第二行似乎是合理的。

是否存在通过 lambda 演算操作在 python(或其他可以使用函数的语言)中修复此错误的直接方法?

我问这个问题只是出于好奇,想了解更多关于函数式语言的知识,但在我看来,这个答案有助于产生函数的循环计算!

当然可以。在 Lisp/Scheme 系列中,您可以使用 let* 来达到这个目的:

(let* ((f (lambda (x) x))
       (f (lambda (x) (+ (f x) 1))))
  (display (f 1)))

请注意,除了前缀表示法之外,您会发现 Scheme 语法更接近 lambda 演算。 let* 构造顺序定义名称,允许在第二个主体中使用第一个名称,即使您“隐藏”它也是如此。

在 Python 中,您必须单独命名函数,如下所示:

f0 = lambda x: x
f1 = lambda x: f0(x) + 1
print(f1(1))

如果你想研究 lambda 演算,尤其是无类型的那种,Scheme 是你的最佳选择,因为大多数 lambda 演算结构将直接映射到它,对前缀语法取模。对于类型化的 lambda 演算,一个不错的选择是像 Haskell 这样的语言。我个人不会使用 Python 来学习函数式编程,因为它将两种风格混为一谈,这将被证明是一种障碍;当然这是可行的。