Haskell:使用严格性的指南

时间:2014-01-22 09:40:34

标签: haskell strict

在Haskell中使用严格性时是否有任何建议指南?

例如,我正在查看tagsoup库。他们的数据结构之一定义如下:

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应该严格?有没有针对此的推荐指南?

1 个答案:

答案 0 :(得分:7)

对于简单的非结构化数据类型,例如IntDouble,将它们转换为严格字段通常是一个很好的默认值。这使得他们的空间消耗非常可预测(并且不变)。虽然由于执行不必要的计算可能会降低性能,但这通常不太可能。例如,跟踪位置通常非常简单和便宜,因此在性能方面没有什么可担心的,并且具有可预测的空间行为更为重要。

使简单类型严格的另一个优点是它们通常可以被解包,即直接存储在构造函数中,而不是通过附加的间接(对于它有pragma或编译器标志)。对于小型,这通常是一个优势。

对于结构化数据类型(如列表或树),情况要复杂得多。一个简单的!在这里很少有用,因为它只会强迫WHNF。评估列表或树在空间方面也可能比未评估的thunk更昂贵。然而,有时候使这些数据更严格也是有意义的。在这种情况下,您通常会使用一个函数(一个所谓的智能构造函数)来包装构造函数,该函数通过在适当的位置调用deepseq来建立严格不变量。