我在Haskell上阅读了一篇有关递归的文章,内容是:


但是lambda演算没有出现在表面上有任何
递归方法,因为表达式的匿名性。怎么做
你叫一个没有名字的东西?能够写递归
但是,功能对于图灵的完整性至关重要。我们使用
组合器–称为Y组合器或定点组合器–
在lambda演算中编写递归函数。 Haskell有母语
递归能力基于与Y组合器相同的原理。


本机递归是什么意思?

考虑以下代码段:

applyTimes :: (Eq a, Num a) => a -> (b -> b) -> b -> b
applyTimes 0 f b = b
applyTimes n f b = f (applyTimes (n-1) f b)


上面的代码不符合Y combinator原则,因为applyTimes是在函数体本身中调用的,并且之前未定义。
如果我错了,请证明我的答案。

最佳答案

“本机递归”是指语言本身支持递归定义。与所有术语都是匿名的准系统lambda演算不同,Haskell确实有一种命名表达式的方法。此外,在给一个名称定义时,您可以使用该名称本身。您自己观察了这一点:在定义applyTimes时,您使用了applyTimes这个名称,因此利用了Haskell对递归的本机支持。

您还可以想象使用支持命名表达式但不支持递归的另一种语言。实际上,许多功能语言分别区分了递归和非递归的定义的“ letrec”和“ let”形式。用这种语言,如果applyTimes的定义使用“ let”形式,则将被拒绝;如果使用“ letrec”形式,则将被接受。

关于haskell - 支持 native 递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44420789/

10-16 19:07