首页 > 解决方案 > 如何修复函数式编程语言中“f = lambda x: f(x)+1”的无限循环错误?

问题描述

考虑python中的以下代码:

f = λ x: x

f = λ x: f(x)+1

f(1)

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

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

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

我问这个问题只是为了更好地了解函数式语言,但在我看来,答案有助于对函数进行循环计算!

标签: functional-programminglambda-calculus

解决方案


当然。在 Lisp/Scheme 系列中,您可以let*为此目的使用:

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

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

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

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

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


推荐阅读