Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:严格使用指南_Haskell_Strict - Fatal编程技术网

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 那么

在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

那么,究竟是什么因素决定了
TagPosition
应该严格?有什么建议的指导原则吗?

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

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


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

列表是非严格的,表示流(根据需要评估其元素是有意义的)。整数表示一个数字。懒洋洋地评估它仍然是有意义的(例如,它可能表示您并不真正需要的流的长度)。简言之:这取决于应用程序。@d8d0d65b3f7cf42实际上,如果我们讨论的是Int之类的东西,如果您从未使用过该值,那么懒惰会更快吗?数字运算速度非常快,我不确定这与发出砰砰声的速度相比有多快。这也没有考虑内存成本。@davidyong,正如我所说,这不太可能。但如果你把这当作一个挑战,我相信有可能想出一个更快的方案。总是有可能有一个
Int
字段,在这个字段上,您几乎不需要进行计算,但计算成本非常高。那么懒惰的
Int
会更快。