我知道seq
用于通过避免不必要的懒惰来提高性能。我只想知道这个名字是从哪里来的?是来自"序列"还是"顺序"?这个名字与严格的评估有什么关系?
它来自序列点。这是 C 语言中一个众所周知的概念,它确实与 Haskell 中的seq
运算符非常相似:左边的每个计算都应该在右边的任何计算之前完成。
当然,Haskellseq
的要求要低一些:它只是要求在评估右边的结果之前,将左边的东西评估为弱头范线形式。它实际上并不能保证任何特定的求值顺序†只是如果左边的表达式是⊥那么右边的表达式一定不会被求值。
请参阅pseq
或deepseq
,了解更接近 C 所称的序列点的更强大的替代方案。
†
实际上,C 或 C++ 序列点也不能保证计算顺序,只是保证任何副作用的顺序正确。但是,在 C 语言中,副作用无处不在,所以除了低级优化之外,你通常可以假设序列点顺序将被维护,而 GHC 实际上经常会抛弃seq
,只要它知道表达式不会发散。