Nik*_*kov 30 containers haskell
有一个具有惰性和严格实现的数据结构列表:
Data.Map.Lazy 和 Data.Map.StrictData.IntMap.Lazy 和 Data.IntMap.StrictData.HashMap.Lazy 和 Data.HashMap.StrictData.ByteString.Lazy 和 Data.ByteString.StrictData.Text.Lazy 和 Data.Text这些实施的优点和缺点是什么?选择特定实施时应遵循哪些规则?
Dan*_*her 26
Data.XYMap.Lazy 和 Data.XYMap.Strictfor XYin {"", "Int", "Hash"}:*.Strict变量强制将映射值的值在放入映射之前对WHNF进行求值.
这样做的最大优点是更可预测的空间和时间行为,因为构建巨大的thunk非常困难,特别是对于form(ConstructorN UnboxedValueTypeN)的类型,这是不可能的.
缺点 - 我记得在讨论严格或惰性变体是否应该成为默认变量时会出现一些例子,但我不记得任何特别的东西.
啊,只记得一个用例:一个可以与Lazy变种打结,这当然不可能与Strict版本!所以如果你做这些事情:Lazy.
我Strict默认使用这些版本.直到我需要打结或遇到另一个用例,我认为这些Lazy变体更优越,我不知道何时会使用它们.
Data.(ByteString/Text).Lazy 和 Data.(ByteString/Text).Strict严格版本为有效载荷使用一个单片存储块,这意味着您可以快速随机访问,不仅可以顺序访问,还可以从末尾向后或者来回跳转.
懒惰版本基本上是严格的严格块列表,它们的优势在于它们的顺序消耗通常可以在恒定的小内存中完成,如果您需要按顺序处理大型文件,那就很好了.
对于小(ish)数据,绝对使用Strict变体,对于大数据,Lazy如果数据是按顺序处理(或多或少),则变量.
Don*_*art 23
这些实施的优点和缺点是什么?选择特定实施时应遵循哪些规则?
该类型的严格性或懒惰导致特定操作或使用模式的不同复杂性.
没有硬性或快速的规则 - 相反,您可能会将它们视为完全不同的数据类型.
如果你坚持一些指导方针:
然后: