Haskell 减少WHNF中的lambda表达式
我必须将以下lambda表达式简化为WHNF,但我不太确定如何进行:Haskell 减少WHNF中的lambda表达式,haskell,lazy-evaluation,lambda-calculus,weak-head-normal-form,Haskell,Lazy Evaluation,Lambda Calculus,Weak Head Normal Form,我必须将以下lambda表达式简化为WHNF,但我不太确定如何进行: (λx y. x 3) (+ 4) (+ 6 7) 那么,我该怎么做呢?减少姓名呼叫 在WHNF中,这个表达式(其他示例)是(λz x.(λx.x)z)x吗?WHNF(弱头范式)意味着您要么有一个值(例如整数)要么有一个表达式,该表达式属于(λx.e(x))类型,其中e(x)是一个可能包含对x的引用的表达式,所以基本上你已经知道结果是一个函数 在您的情况下,您的表达式包含一些需要简化的应用程序: (λx . λy. x 3)
(λx y. x 3) (+ 4) (+ 6 7)
那么,我该怎么做呢?减少姓名呼叫
在WHNF中,这个表达式(其他示例)是(λz x.(λx.x)z)x
吗?WHNF(弱头范式)意味着您要么有一个值(例如整数)要么有一个表达式,该表达式属于(λx.e(x))
类型,其中e(x)
是一个可能包含对x
的引用的表达式,所以基本上你已经知道结果是一个函数
在您的情况下,您的表达式包含一些需要简化的应用程序:
(λx . λy. x 3) (+ 4) (+ 6 7) = (λy . (+ 4) 3) (+ 6 7)
= (+ 4) 3
= 7
请注意,在这种情况下,y
不会出现在函数体中,因此+6 7
在还原过程中“消失”
否,
(λz x.(λx.x)z)x
在WHNF中是而不是,因为“top操作符”仍然是一个应用程序。注意,这种情况下的减少有点棘手,因为外部有一个自由变量x
,而λ
也绑定x
。但是,我们可以先做一些重命名:(λzk.(λt.t)z)x
,然后执行缩减:(λk.(λt.t)x)
,这现在在WHNF中。注意,我们不会减少应用程序(λt.t)x
,因为它位于λ
内部
要检查表达式是否在WHNF中,必须将其视为语法树。让我们考虑上面的两个例子,让我们用“代码> $< /代码>明确地表示应用程序。请记住,应用程序
fxy
相当于(fx)y
在第一种情况下,表达式为:
|
+-------------$-----------+
| |
+---- $ ---- +---(+)---+
| | | |
λx λt 6 7
| |
λy +-(+)-+
| | |
+---$---+ t 4
| |
x 3
正如您所看到的,树的根是$
,因此我们必须执行应用程序。为了做到这一点,我们必须首先减少左侧,这也是一个$
,因此必须首先减少左侧,获得:
|
+-------------$-----------+
| |
| +---(+)---+
| | |
| 6 7
|
λy
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
|
7
现在在左边我们有一个λ
,因此我们可以减少最外层的应用程序$
:
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
现在根仍然是$
,所以我们也必须减少它:
|
+-(+)-+
| |
3 4
根是+
,因此我们再次减少:
|
+-------------$-----------+
| |
| +---(+)---+
| | |
| 6 7
|
λy
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
|
7
现在我们完成了
在第二种情况下,我们有表达式(λz.λk.((λt.t)z))x
,它成为树:
|
+-------$-----------------+
| |
λz x
|
λk
|
+----$----+
| |
λt z
|
t
同样,根是$
,因此我们必须减少它:
λk
|
+----$----+
| |
λt x
|
t
现在我们有一棵树,它的根是λ
,这意味着表达式在WHNF中,所以我们停止。WHNF(弱头范式)意味着你要么有一个值(例如一个整数)要么有一个表达式是(λx.e(x))
其中e(x)
是一个可能包含对x
的引用的表达式,所以基本上你已经知道结果是一个函数
在您的情况下,您的表达式包含一些需要简化的应用程序:
(λx . λy. x 3) (+ 4) (+ 6 7) = (λy . (+ 4) 3) (+ 6 7)
= (+ 4) 3
= 7
请注意,在这种情况下,y
不会出现在函数体中,因此+6 7
在还原过程中“消失”
否,
(λz x.(λx.x)z)x
在WHNF中是而不是,因为“top操作符”仍然是一个应用程序。注意,这种情况下的减少有点棘手,因为外部有一个自由变量x
,而λ
也绑定x
。但是,我们可以先做一些重命名:(λzk.(λt.t)z)x
,然后执行缩减:(λk.(λt.t)x)
,这现在在WHNF中。注意,我们不会减少应用程序(λt.t)x
,因为它位于λ
内部
要检查表达式是否在WHNF中,必须将其视为语法树。让我们考虑上面的两个例子,让我们用“代码> $< /代码>明确地表示应用程序。请记住,应用程序
fxy
相当于(fx)y
在第一种情况下,表达式为:
|
+-------------$-----------+
| |
+---- $ ---- +---(+)---+
| | | |
λx λt 6 7
| |
λy +-(+)-+
| | |
+---$---+ t 4
| |
x 3
正如您所看到的,树的根是$
,因此我们必须执行应用程序。为了做到这一点,我们必须首先减少左侧,这也是一个$
,因此必须首先减少左侧,获得:
|
+-------------$-----------+
| |
| +---(+)---+
| | |
| 6 7
|
λy
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
|
7
现在在左边我们有一个λ
,因此我们可以减少最外层的应用程序$
:
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
现在根仍然是$
,所以我们也必须减少它:
|
+-(+)-+
| |
3 4
根是+
,因此我们再次减少:
|
+-------------$-----------+
| |
| +---(+)---+
| | |
| 6 7
|
λy
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
|
7
现在我们完成了
在第二种情况下,我们有表达式(λz.λk.((λt.t)z))x
,它成为树:
|
+-------$-----------------+
| |
λz x
|
λk
|
+----$----+
| |
λt z
|
t
同样,根是$
,因此我们必须减少它:
λk
|
+----$----+
| |
λt x
|
t
现在我们有一棵树,它的根是λ
,这意味着表达式在WHNF中,所以我们停止