Haskell中的递归lambda

时间:2016-03-05 19:47:01

标签: haskell lambda

让我们看看使用lambda函数分析Haskell中的阶乘代码:

y f x = f (y f) x

factorial = y (\t n -> if n == 1 then 1 else n * t(n-1))

我无法理解它是如何运作的。我知道它与lambda演算有关,但是现在我对它并不熟悉,所以我必须在没有它或知识最少的情况下理解。 我的疑问是: 阶乘的定义是什么?我的意思是这个f:y f x = f(y f)x。

那么这里有什么? y(\ t n - >如果n == 1则1其他n * t(n-1))

请解释一下,也许扩展递归?

3 个答案:

答案 0 :(得分:5)

f中的factorial(\t n -> if n == 1 ...) lambda

y是一个所谓的fix-point combinator,它用于在lambda-calculus中启用递归定义(它再次递归地将f应用于它的参数)

要了解它是如何工作的,您可以手动进行评估

factorial 3
= y (\t n -> ...) 3
{ def y and y (\t n -> ...) = factorial by eta-red. }
= (\t n -> ...) factorial 3
{ t = factorial, n = 3 -> else case }
= 3 * factorial 2
= 3 * (y (\t n -> ...) 2)
= 3 * ((\t n -> ...) factorial 2)
= { t = factorial, n = 2 -> else case }
= 3 * (2 * factorial 1)
= 3 * (2 * (y (\t n -> ...) 1))
= 3 * (2 * ((\t n -> ...) factorial 1)))
{ t = factorial n = 1 -> then case }
= 3 * (2 * 1)
= 6

答案 1 :(得分:1)

yfixed-point combinator,也称为y-combinator。在

factorial = y (\t n -> if n == 1 then 1 else n * t(n-1))

lambda (\t n -> if n == 1 then 1 else n * t(n-1))f的定义中绑定到y。然后,您可以进行扩展:

(\t n -> if n == 1 then 1 else n * t(n-1)) (y (\t n -> if n == 1 then 1 else n * t(n-1)))

所以在lambda中,t将绑定到lambda本身,这允许它以递归方式调用自身。

答案 2 :(得分:0)

如果你用两个eta-expansions写出 y 组合器,也许会更容易:

y :: ((a->b) -> a->b) -> a->b
y f x a = f (\q a' -> y f q a') x a

所以f基本上是递归调用(用a'代替a)作为它的第一个参数。