【发布时间】:2019-09-22 08:51:20
【问题描述】:
我正在阅读一本关于 λ 演算的书“通过 Lambda 演算进行函数式编程”(Greg Michaelson)。在书中,作者介绍了一种用于定义函数的简写符号。例如
def identity = λx.x
并继续说,我们应该坚持在使用这种速记时“所有定义的名称都应该被它们的定义替换在表达式被计算之前”
稍后,在介绍递归时,他以加法函数的定义为例,例如:
def add x y = if iszero y then x else add (succ x) (pred y)
也就是说,如果我们没有上面提到的限制,我们将能够通过慢慢扩展来评估这个函数。然而,由于我们有在计算表达式之前替换所有定义的名称的限制,我们不能这样做,因为我们继续无限地替换add,因此需要以更详细的方式考虑递归。
因此,我的问题如下:对我们自己施加这种限制的理论或实践原因是什么? (必须替换所有定义的名称之前函数的评估)?有吗?
【问题讨论】:
标签: lambda-calculus y-combinator