Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 减少WHNF中的lambda表达式_Haskell_Lazy Evaluation_Lambda Calculus_Weak Head Normal Form - Fatal编程技术网

Haskell 减少WHNF中的lambda表达式

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)

我必须将以下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) (+ 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中,所以我们停止