2014-08-31 53 views
6

在Haskell中,lambda被认为是在WHNF中,而未应用的用户定义的函数则不是。这种区别背后的动机是什么?为什么Haskell认为lambda抽象处于弱头范式(WHNF)?

+1

请注意,正如在某种程度上讨论的那样,在可能的重复中,被认为是WHNF的东西和被认为在短时间内无副作用的东西之间的区别将*评价为* WHNF是一个有点武断的决定。 – 2014-08-31 22:31:51

回答

9

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

cleverFunction = \x -> simpleCombine x expensiveConstant 
where expensiveConstant = ... 
     simpleCombine x c = ... 

注意,虽然cleverFunction被定义为的λ,它不是在WHNF因为where块(糖为(\l x -> ...) locBindings)。

没有任何封闭的范围一个lambda没有可能之前调用(变量拉姆达仅适用于单呼,和垃圾收集之后)计算的变量,即它已经在正常的形式(实际NF,而不仅仅是WHNF)。

+0

即使'\ x - >(1 + 1 :: Integer)'? – immibis 2016-11-03 03:54:12

+0

@immibis ... - ? – leftaroundabout 2016-11-03 11:08:35

+0

在调用lambda之前,似乎可以将'(1 + 1 :: Integer)'简化为'2 :: Integer'。 – immibis 2016-11-03 21:09:46