【发布时间】:2014-08-31 20:48:13
【问题描述】:
在 Haskell 中,lambdas 被认为是在 WHNF 中,而未应用的用户定义函数则不是。这种区别背后的动机是什么?
【问题讨论】:
-
请注意,正如在链接的可能重复项中所讨论的那样,被认为是 WHNF 和被认为肯定会在短时间内且没有副作用评估的东西之间的区别 into WHNF 是一个有点武断的决定。
标签: haskell weak-head-normal-form
在 Haskell 中,lambdas 被认为是在 WHNF 中,而未应用的用户定义函数则不是。这种区别背后的动机是什么?
【问题讨论】:
标签: haskell weak-head-normal-form
将信息附加到函数中通常很有用,这些信息需要在评估函数之前进行计算,但之后可以在调用之间共享。
cleverFunction = \x -> simpleCombine x expensiveConstant
where expensiveConstant = ...
simpleCombine x c = ...
请注意,尽管 cleverFunction 被定义为 lambda,但由于 where 块((\l x -> ...) locBindings 的糖),它不在 WHNF 中。
没有任何封闭范围的 lambda 没有可以在调用之前计算的变量(变量 in lambda 仅对单个调用有效,并且在之后被垃圾收集),即它已经在范式(实际上是 NF,而不仅仅是 WHNF)。
【讨论】:
\x -> (1 + 1 :: Integer)?
(1 + 1 :: Integer) 似乎可以简化为 2 :: Integer
\x -> 1 + undefined 不会尝试评估结果,除非您调用该函数。 IE。 语义上,一个 lambda 总是已经在 NF 中。