在Haskell中,lambda被认为是在WHNF中,而未应用的用户定义的函数则不是。这种区别背后的动机是什么?为什么Haskell认为lambda抽象处于弱头范式(WHNF)?
回答
在您可以评估函数之前,将信息附加到需要计算的函数通常很有用,但之后可以在调用之间共享。
cleverFunction = \x -> simpleCombine x expensiveConstant
where expensiveConstant = ...
simpleCombine x c = ...
注意,虽然cleverFunction
被定义为的λ,它不是在WHNF因为where
块(糖为(\l x -> ...) locBindings
)。
没有任何封闭的范围一个lambda没有可能之前调用(变量在拉姆达仅适用于单呼,和垃圾收集之后)计算的变量,即它已经在正常的形式(实际NF,而不仅仅是WHNF)。
即使'\ x - >(1 + 1 :: Integer)'? – immibis 2016-11-03 03:54:12
@immibis ... - ? – leftaroundabout 2016-11-03 11:08:35
在调用lambda之前,似乎可以将'(1 + 1 :: Integer)'简化为'2 :: Integer'。 – immibis 2016-11-03 21:09:46
- 1. 为什么编译器认为这个类是抽象的(C++)?
- 2. 为什么将doGet抽象为processRequest?
- 3. Haskell:模式匹配(x:_):为什么列表头与x有界?
- 4. 为什么接口或抽象类有用? (或为什么?)
- 5. 为什么在接口为什么不能在抽象类
- 6. 为什么Java中的lambda表达式被称为“lambda”?
- 7. 为什么需要抽象类?
- 8. 这是为什么抽象类在PHP
- 9. 为什么使用抽象类
- 10. 为什么不抽象政策?
- 11. 为什么要使用抽象工厂
- 12. 为什么这个班会抽象?
- 13. 这个班为什么抽象?
- 14. 为什么你需要知道抽象类的抽象方法是否抽象
- 15. Rails为什么认为6,500大于10,000?
- 16. 为什么-9认为大于1?
- 17. 如何编写lambda表达式为抽象类
- 18. 为什么findViewById()在抽屉头中为视图返回null?
- 19. 为什么锁被认为违反了抽象和可组合性的原则?
- 20. 为什么:即使当我评估变量时,sprint显示WHNF?
- 21. Spec Explorer - 行为的抽象规范
- 22. 为什么使用#'与lambda?
- 23. 抽象lambda表达式的建议
- 24. 为什么WMDC/ActiveSync如此脆弱?
- 25. 这是为什么弱多态性
- 26. TYPO3:什么抽象用于文章?
- 27. 为什么要使用__attribute __((弱))和#pragma弱?
- 28. ASP.NET System.Web.Abstractions为什么将它们创建为抽象Base类?
- 29. 为什么NSTextView不能用于弱引用?
- 30. 为什么OpenBSD的G ++使系统头默认为C链接?
请注意,正如在某种程度上讨论的那样,在可能的重复中,被认为是WHNF的东西和被认为在短时间内无副作用的东西之间的区别将*评价为* WHNF是一个有点武断的决定。 – 2014-08-31 22:31:51