首页 > 解决方案 > Haskell 函数 `seq` 的名称从何而来?

问题描述

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

标签: haskell

解决方案


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

当然,Haskell的要求要低一些:它只是要求在评估右侧的结果之前将seq左侧的事物评估为弱头范式。而且它根本不保证任何特定的评估顺序†</sup>,只是如果左边的表达式是⊥,那么右边的表达式不能被评估。

参见pseqdeepseq寻找更强大的替代方案,这些替代方案更接近 C 所称的序列点。


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


推荐阅读