functional-programming - 如何修复函数式编程语言中“f = lambda x: f(x)+1”的无限循环错误?
问题描述
考虑python中的以下代码:
f = λ x: x
f = λ x: f(x)+1
f(1)
Python 在运行最后一行时抛出“无限循环”错误,这在它将第二行解释为 f 的递归公式的方式上很清楚。
但是,如果在右侧替换 f 的“值”,然后将结果函数分配给 f(在左侧),则第二行似乎是合理的。
是否存在通过 lambda 演算操作在 python(或另一种可以使用函数的语言)中修复此错误的直接方法?
我问这个问题只是为了更好地了解函数式语言,但在我看来,答案有助于对函数进行循环计算!
解决方案
当然。在 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 来学习函数式编程,因为它将两种风格混为一谈,这将被证明是一种障碍;虽然这当然是可行的。
推荐阅读
- javascript - MERN 堆栈,表示错误 - apiroutes 处的“TypeError:无法读取未定义的属性 '_id'”
- python - 通过 cython 从 python 访问 c++ 向量/数组
- python - 条件下如何在Python中创建不同的csv文件
- r - 使用每个变量的最大值创建 ggplot2 图的 R 函数是什么?
- qt - QStringList 将数据存储在堆栈上还是堆上?
- mysql - mysql查询特定用户的发送和接收消息
- python - Python“ModuleNotFoundError:没有名为‘numbers’的模块”
- python - 对对象列表进行排序并按属性(适应度)值重新索引
- javascript - JavaScript 块循环逻辑
- android - Google Place Picker 需要点击三下才能打开