【发布时间】:2018-05-24 06:25:26
【问题描述】:
我已多次阅读,在 Haskell 中系统地标记记录的字段 strict 是一种很好的做法,例如而不是
data Foo = Foo { bar :: Bar, quux :: Quux }
做
data Foo = Foo { bar :: !Bar, quux :: !Quux}
例如,这是来自Haskell Programming from First Principles,第1134页的引用:
要遵循的一个好规则是脊椎懒惰,叶子严格!
我(想我)明白什么是严格以及两者之间的区别。我不明白的是为什么后者系统地这样做?
【问题讨论】:
-
您能否添加对您阅读的地方的引用,这是一个很好的做法
systematically。谢谢。 -
我不会系统地那样做。但是,在某些情况下,在叶子中保持严格确实有助于提高性能,尤其是对于像
Char,Int,Bool,()这样的小型数据类型。 FWIW,我通常让一切变得懒惰,然后在分析我的代码时尝试将事情变得更严格,看看是否有改进。 -
我倾向于认为记录字段应该是严格的,除非有理由让它们变得懒惰,但相反的立场是可以辩护的。使字段变得惰性的一个原因是其类型未知(因此可能是函数或类似的)。
-
据我所知,您希望对“小”值进行严格处理,因为不必要的懒惰会导致内存泄漏。在许多情况下,评估 thunk 并存储结果比保留大量不必要的 thunk 更便宜。
-
那里有很多货物崇拜的严格性。偶尔它很好,但它通常会导致像我这样的人提交错误报告,说你的类型和函数太严格了。
标签: haskell