我带了Haskell book并且与beta reduce相抗衡。
我确实理解这个概念但不知道,如何使用它,当我在我面前有一个lambda时。 例如:
(λ a b c . c b a) z z (λ w v . w)
如何减少它?
答案 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减少 - 如果需要,因为它是惰性的 - 直到得到结果值。