gpt4 book ai didi

haskell - 这让表达式如何工作?

转载 作者:行者123 更新时间:2023-12-04 03:03:18 24 4
gpt4 key购买 nike

鉴于这行 Haskell 代码,我的任务是将其评估为最简单的形式。

let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20

我已经得到了答案(当然,我自己也在 GHCI 中对其进行了评估): 42
但是,我想更好地了解评估在这里的实际工作方式。一般来说,我想我知道(简单)让表达式如何工作:

例子
a = let y = 5 in y * 5  -- a == 25

计算结果为 25因为我们绑定(bind)了 y5 的值和 a被赋值为 y*5 ( in 之后的部分)。绑定(bind) y = 5仅在 let 范围内有效.

到目前为止,唯一的解释(至少计算为 42)如下:
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
  • g(\x -> k (h x))
  • h(+1) (函数(\x -> x+1))
  • k(\x -> x+x)
  • 20g 的输入产生k (h 20)
  • h 2020 + 1 = 21
  • k (h 20) = k 21 = 21 + 21 = 42

  • 但令我困惑的是 g h k 的使用。让后。这意味着什么?

    最佳答案

    考虑一个函数定义。如果你写:

    g h k x = k (h x)

    然后是一个接受三个参数的函数 h , kx并返回 k (h x) .这相当于:
    g h k = \x -> k (h x)

    或者:
    g h = \k x -> k (h x)

    或者:
    g = \h k x -> k (h x)

    所以我们可以在函数的头部和函数体中的 lambda 表达式之间传递变量。事实上,Haskell 编译器会重写它。

    所以使用 let表达式,我们定义了一个局部范围的函数,就像上面定义的那样。现在,如果我们调用 g (+1) (\x -> x+x) 20 , 然后将调用 gh = (+1) , k = (\x -> x+x)x = 20 .

    所以我们将其评估为:
    (\x -> x+x) ((+1) 20)

    评估为:
       (\x -> x+x) ((+1) 20)
    -> ((+1) 20)+((+1) 20)
    -> 21 + 21
    -> 42

    关于haskell - 这让表达式如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344012/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com