【问题标题】:Why does Haskell consider lambda abstractions to be in Weak Head Normal Form (WHNF)? [duplicate]为什么 Haskell 认为 lambda 抽象是弱头范式(WHNF)? [复制]
【发布时间】:2014-08-31 20:48:13
【问题描述】:

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

【问题讨论】:

  • 请注意,正如在链接的可能重复项中所讨论的那样,被认为是 WHNF 和被认为肯定会在短时间内且没有副作用评估的东西之间的区别 into WHNF 是一个有点武断的决定。

标签: haskell weak-head-normal-form


【解决方案1】:

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

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)?
  • 在调用 lambda 之前,(1 + 1 :: Integer) 似乎可以简化为 2 :: Integer
  • 嗯,是的,但这将是一个优化问题。最肯定的是,\x -> 1 + undefined 不会尝试评估结果,除非您调用该函数。 IE。 语义上,一个 lambda 总是已经在 NF 中。
猜你喜欢
  • 2011-10-15
  • 2014-08-18
  • 2011-01-08
  • 2012-07-04
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多