在Haskell中,lambdas被认为是在WHNF中,而未应用的用户定义函数则不是。这种区别背后的动机是什么?
答案 0 :(得分:9)
将信息附加到需要计算的函数之前通常很有用,然后才能评估函数,但之后可以在调用之间共享。
cleverFunction = \x -> simpleCombine x expensiveConstant
where expensiveConstant = ...
simpleCombine x c = ...
请注意,尽管cleverFunction
被定义为lambda,但由于where
块((\l x -> ...) locBindings
的糖),它不在WHNF中。
没有任何封闭范围的lambda没有可以在调用之前计算的变量(变量 in lambda仅对单个调用有效,之后进行垃圾收集),即它已经在正常形式(实际上是NF,而不仅仅是WHNF)。