使用beta减少

时间:2017-01-24 14:45:47

标签: haskell functional-programming

我带了Haskell book并且与beta reduce相抗衡。

我确实理解这个概念但不知道,如何使用它,当我在我面前有一个lambda时。 例如:

(λ a b c . c b a) z z (λ w v . w)

如何减少它?

1 个答案:

答案 0 :(得分:9)

首先:

(λ a b c . c b a) z z (λ w v . w)

简称:

(λ a . (λ b . (λ c . c b a) ) ) z z (λ w . (λ v . w) )

好的,你应用beta减少:

a b c . c b a) z z (λ w v . w)

(粗体添加了“主动”变量可以这么说,斜体代替它)

您因此将 a 替换为oparand z ,现在结果为:

(λ b c . c b z) z (λ w v . w)

因此,我们在lambda表达式的范围内将a替换为z ,接下来我们执行了额外的缩减:

b c . c b z) z (λ w v . w)

为:

(λ c . c z z) (λ w v . w)

现在你也可以使用beta-reduction来注入函数,如下所示:

c . c z z) (λ w v . w)

分为:

((λ w v . w) z z)

所以我们还没有结束。因为头部还有一个lambda表达式:

w v . w) z z

成:

(λ v . z) z

最后这本书证明头部中的变量不需要身体中的变量,因此最后的β减少对身体没有影响(但它删除了最后一个lambda-表达式):

v . z) z

成:

(z)

或:

z

Beta减少或多或少是每种函数式编程语言背后的原因:Haskell重复调用beta减少 - 如果需要,因为它是惰性的 - 直到得到结果值。