6
什么是弱头范式?
什么弱头范式(WHNF)是什么意思?什么头标准型(HNF)和范式(NF)是什么意思? 现实世界中的Haskell指出: 熟悉的seq函数将表达式计算为我们称为head正常形式(缩写为HNF)的表达式。一旦到达最外部的构造函数(“头”),它将停止。这与完全评估表达式的正常形式(NF)不同。 您还将听到Haskell程序员提到弱头正常形式(WHNF)。对于正常数据,弱磁头正常形式与磁头正常形式相同。差异仅在功能上出现,在这里太过深刻了,我们不必担心。 我已经阅读了一些资源和定义(Haskell Wiki和Haskell邮件列表和Free Dictionary),但我不明白。有人可以举一个例子或一个外行的定义吗? 我猜这将类似于: WHNF = thunk : thunk HNF = 0 : thunk NF = 0 : 1 : 2 : 3 : [] 如何seq与($!)涉及到WHNF和HNF? 更新资料 我还是很困惑。我知道一些答案说可以忽略HNF。通过阅读各种定义,似乎WHNF和HNF中的常规数据之间没有区别。但是,在功能上似乎确实有所不同。如果没有差异,为什么seq要这样做foldl'? 另一个令人困惑的地方来自Haskell Wiki,它声明seq将其简化为WHNF,并且不会对以下示例进行任何操作。然后他们说他们必须使用seq强制评估。这不是强迫它使用HNF吗? 常见的新手堆栈溢出代码: myAverage = uncurry (/) . foldl' (\(acc, len) x -> (acc+x, len+1)) (0,0) 了解seq和弱头范式(whnf)的人可以立即了解这里出了什么问题。(acc + …