如何修复函数式编程语言中"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 来学习函数式编程,因为它将两种风格混为一谈,这将被证明是一种障碍;当然这是可行的。
考虑 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 来学习函数式编程,因为它将两种风格混为一谈,这将被证明是一种障碍;当然这是可行的。