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