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