问题描述
我正在阅读《从第一原理开始的Haskell编程》一书,尽管作者试图详细解释如何简化表达式,但我仍然难以理解如何在提供的示例中阅读某些表达式。
我们假设以下表达式:
(λx.x)
然后,如果我正确理解,可以理解为:“一个lambda函数,它接受参数x
并返回(基本上将.
转换为“ returns”),值x
。
现在假设我们具有以下表达式:
(λxy.xy)
,我们如何用普通英语阅读该表达?为了使其更加复杂,作者然后将(λxy.xy)
扩展到(λxy.xy)(λz.a) 1
。这些z
和a
在以上表达式中如何显示?我希望,如果我可以将表达式正确地转换为简单的英语,就能理解z
和a
的来源。
解决方法
在lambda演算中,彼此相邻的值表示将第一个值作为函数调用,而将第二个值作为参数调用。 (λxy.xy)
是(λx.λy.xy)
的简写,表示函数需要一个参数x然后是参数y,并使用参数y调用x。 (如果您想知道为什么会有一个函数返回一个函数,那是由于currying造成的)。要弄清楚(λxy.xy)(λz.a) 1
的含义,我们必须逐步进行:
- 撤消简写:
(λx. λy. xy) (λz. a) 1
- 应用第一个功能(
λx
):(λy. (λz. a) y) 1
- 应用第二个功能(
λy
):(λz. a) 1
- 应用第三个功能(
λz
):a
因此,我们最终得到了a
(可能是一个外部定义的常量)。