为什么Haskell认为lambda抽象是弱头范式(WHNF)?

Mat*_*eon 6 haskell weak-head-normal-form

在Haskell中,lambdas被认为是在WHNF中,而未应用的用户定义函数则不是.这种区别背后的动机是什么?

lef*_*out 9

在您可以评估函数之前将信息附加到需要计算的函数通常很有用,但之后可以在调用之间共享.

cleverFunction = \x -> simpleCombine x expensiveConstant
 where expensiveConstant = ...
       simpleCombine x c = ...
Run Code Online (Sandbox Code Playgroud)

请注意,虽然cleverFunction被定义为lambda,但由于where块(糖(\l x -> ...) locBindings),它不在WHNF中.

没有任何封闭范围的lambda没有可以在调用之前计算的变量( lambda中的变量仅对单个调用有效,之后进行垃圾收集),即它已经处于正常形式(实际上是NF,而不仅仅是WHNF) .