在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
应该严格?有没有针对此的推荐指南?
答案 0 :(得分:7)
对于简单的非结构化数据类型,例如Int
或Double
,将它们转换为严格字段通常是一个很好的默认值。这使得他们的空间消耗非常可预测(并且不变)。虽然由于执行不必要的计算可能会降低性能,但这通常不太可能。例如,跟踪位置通常非常简单和便宜,因此在性能方面没有什么可担心的,并且具有可预测的空间行为更为重要。
使简单类型严格的另一个优点是它们通常可以被解包,即直接存储在构造函数中,而不是通过附加的间接(对于它有pragma或编译器标志)。对于小型,这通常是一个优势。
对于结构化数据类型(如列表或树),情况要复杂得多。一个简单的!
在这里很少有用,因为它只会强迫WHNF。评估列表或树在空间方面也可能比未评估的thunk更昂贵。然而,有时候使这些数据更严格也是有意义的。在这种情况下,您通常会使用一个函数(一个所谓的智能构造函数)来包装构造函数,该函数通过在适当的位置调用deepseq
来建立严格不变量。