Haskell:严格使用指南
在Haskell中何时使用严格性有什么建议指南吗 例如,我在看图书馆。它们的一个数据结构定义如下:Haskell:严格使用指南,haskell,strict,Haskell,Strict,在Haskell中何时使用严格性有什么建议指南吗 例如,我在看图书馆。它们的一个数据结构定义如下: data Tag str = TagOpen str [Attribute str] | TagClose str | TagText str | TagComment str | TagWarning str | TagPosition !Row !Column type Row = Int type Column = Int 那么
data Tag str
= TagOpen str [Attribute str]
| TagClose str
| TagText str
| TagComment str
| TagWarning str
| TagPosition !Row !Column
type Row = Int
type Column = Int
那么,究竟是什么因素决定了
TagPosition
应该严格?有什么建议的指导原则吗?对于简单的非结构化数据类型,如Int
或Double
,将它们转换为严格的字段通常是一个很好的默认值。这使得他们的空间消耗非常可预测(并且是恒定的)。虽然可能由于执行不必要的计算而导致性能下降,但这通常是不可能的。例如,跟踪一个位置通常是非常简单和便宜的,因此在性能方面没有什么可怕的,而具有可预测的空间行为更为重要
使简单类型严格的另一个优点是,它们通常可以解包,即直接存储在构造函数中,而不是通过附加的间接寻址(有pragma或编译器标志)。对于小型类型,这通常是一个优势
对于结构化数据类型,如列表或树,情况要复杂得多。一个简单的
代码>在这里很少有帮助,因为它只强制执行WHNF。在空间方面,经过评估的列表或树也很容易比未经评估的thunk更昂贵。尽管如此,有时将这些数据严格化也是有道理的。在这种情况下,您通常会使用函数(所谓的智能构造函数)包装构造函数,该函数通过在适当的位置调用deepseq
来建立严格不变量。列表是非严格的,表示流(根据需要评估其元素是有意义的)。整数表示一个数字。懒洋洋地评估它仍然是有意义的(例如,它可能表示您并不真正需要的流的长度)。简言之:这取决于应用程序。@d8d0d65b3f7cf42实际上,如果我们讨论的是Int之类的东西,如果您从未使用过该值,那么懒惰会更快吗?数字运算速度非常快,我不确定这与发出砰砰声的速度相比有多快。这也没有考虑内存成本。@davidyong,正如我所说,这不太可能。但如果你把这当作一个挑战,我相信有可能想出一个更快的方案。总是有可能有一个Int
字段,在这个字段上,您几乎不需要进行计算,但计算成本非常高。那么懒惰的Int
会更快。