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