Questions tagged «strictness»

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

7
Haskell的严格点是什么?
我们都知道(或应该知道)Haskell默认是懒惰的。在必须评估之前,不会评估任何内容。那么什么时候必须对某些东西进行评估?在某些方面,Haskell必须严格。我称这些为“严格点”,尽管这个特定术语没有我想象的那么广泛。据我说: Haskell中的减少(或评估) 仅在严格点进行。 所以,问题是:什么,准确地说,是Haskell的严格点?我的直觉说main,seq/爆炸模式,模式匹配以及IO通过执行的任何操作main都是主要的严格要求,但是我真的不知道为什么知道这一点。 (另外,如果他们不叫“严点”,什么是他们叫什么名字?) 我想一个很好的答案将包括有关WHNF的一些讨论。我也想像它可能会影响lambda演算。 编辑:关于此问题的其他想法。 正如我对这个问题的思考一样,我认为在严格性点的定义中添加一些内容会更加清晰。严格点可以具有变化的上下文和变化的深度(或严格性)。回到我的定义“ Haskell的减少仅在严格性点发生”,让我们在该定义中添加以下条款:“严格性点仅在评估或减少其周围上下文时触发。” 因此,让我尝试让您开始我想要的答案。main是严格的一点。它被专门指定为上下文的主要严格要点:程序。在main评估程序(的上下文)时,将激活main的严格点。Main的深度最大:必须对其进行充分评估。Main通常由IO操作组成,这些操作也是严格意义上的要点,其上下文是main。 现在您尝试:seq用这些术语讨论和模式匹配。解释功能应用的细微差别:它有多严格?怎么不行 那deepseq呢 let和case陈述?unsafePerformIO?Debug.Trace?顶级定义?严格的数据类型?爆炸图案?等等,仅用seq或模式匹配就可以描述其中的多少项?
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.