当浏览Hackage,大部分的单子有一个懒惰的,并有严格的版本。 到底是什么区别? 你可以与普通单子(州,读者,作家)一些例子突出呢?
Answer 1:
我不知道一个分离成懒惰和严格的读者单子,为的原因State(T)
和Writer(T)
分离不存在适用。
懒惰和严格的区别Writer
和State
单子RESP。 他们的单子变压器是一元绑定的执行(>>=)
fmap
等。在严格的版本中,在一对的实施图案匹配( (result, state)
,RESP。 (result, message)
),迫使其评价( 未及其组件的评价),而懒惰版本使用一个无可辩驳的图案~(a,w)
存在,其不强制对评价。
懒惰的版本允许某些应用是不可能严格的版本,如
foo = do
xs <- take 100 `fmap` sequence (repeat someAction)
doSomethingWith xs
该sequence
的动作的无限名单才能开始交付其结果,如果(>>=)
的单子足够懒惰。
在另一方面,使用懒惰版本常常导致在大的thunk的积聚(result, state)
对,并且因此空间和/或时间的泄漏。
所以,这两个变体提供,你可以选择更适合您的需求。
文章来源: Difference between Haskell's Lazy and Strict monads (or transformers)