Haskell 函数`seq` 的名称从何而来?

Dan*_*ral 8 haskell

我知道它seq用于通过避免不必要的懒惰来提高性能。我只想知道这个名字是从哪里来的?它来自“顺序”还是“顺序”?名称与严格评估有何关系?

lef*_*out 9

它来自序列点。这是 C 中的一个众所周知的概念,它确实与seqHaskell 中的运算符非常相似:左侧的每个计算都应该在右侧的任何计算之前完成

当然,Haskell 的seq要求要低一些:它只是要求在计算右边的结果之前先将左边的东西计算为弱头范式。并且它根本不保证任何特定的评估顺序,仅当左侧的表达式是 ? 那么右边的那个不能被评估。

查看pseqdeepseq更强大的替代方案,它们更接近 C 所称的序列点。


实际上,C 或 C++ 序列点也不保证计算顺序,只保证任何副作用的顺序正确。但是,在 C 中副作用无处不在,因此除了低级优化之外,您通常可以假设序列点顺序将得到维护,而 GHC 实际上会经常丢弃seqs,只要它知道表达式不会发散。

  • 我不认为“如果左边的表达式是 ⊥ 那么就不能评估右边的表达式”。例如,请参见 https://wiki.haskell.org/Seq,其中提到 `seq ab` 的合法实现将是:“计算 `b`,然后计算 `a`,然后返回 `b`”。 (4认同)