Questions tagged «weak-head-normal-form»

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 + …

1
Haskells弱头范式
我偶然发现了一些令人讨厌的东西。我知道haskell可用于弱头正常形式(WHNF),而且我知道这是什么。将以下代码键入ghci(据我所知,我正在使用命令:sprint,将表达式简化为WHNF): let intlist = [[1,2],[2,3]] :sprint intlist 给intlist = _这使得完全意义的我。 let stringlist = ["hi","there"] :sprint stringlist 给stringlist = [_,_] 这已经使我感到困惑。但是之后: let charlist = [['h','i'], ['t','h','e','r','e']] :sprint charlist 令人惊讶地给 charlist = ["hi","there"] 据我了解,Haskell,字符串不过是字符列表,这似乎可以通过检查类型"hi" :: [Char]和来确认['h','i'] :: [Char]。 我感到困惑,因为根据我的理解,以上所有三个示例大致相同(列表列表),因此应简化为相同的WHNF,即_。我想念什么? 谢谢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.