鉴于这行Haskell代码,我的任务是将其评估为最简单的形式。
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
我已经得到了答案(当然,在GHCI中也对其进行了评估):42
但是,我想更好地理解这里实际上是如何进行评估的。一般来说,我认为我知道(简单的)let表达式是如何工作的:
示例
a = let y = 5 in y * 5 -- a == 25
这个表达式的值为25
,因为我们将y
绑定到了5
的值,并且a
被赋值为y * 5
的值(在in
后面的部分)。绑定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)
20
是g
的输入,得到k (h 20)
h 20
的结果为20 + 1
=21
k (h 20)
=k 21
=21 + 21
=42
但是让我困惑的是在 let 之后使用了 g h k
。这是什么意思?
g
是g = \h k x -> k (h x)
左边的变量也是参数。 - Willem Van Onsemg = flip (.) = (>>>)
。g h k x = k . h $ x = x & (h >>> k) = h x & k
。 - Will Ness