Difference between Haskell's Lazy and Strict m

2019-07-03 12:28发布

当浏览Hackage,大部分的单子有一个懒惰的,并有严格的版本。 到底是什么区别? 你可以与普通单子(州,读者,作家)一些例子突出呢?

Answer 1:

我不知道一个分离成懒惰和严格的读者单子,为的原因State(T)Writer(T)分离不存在适用。

懒惰和严格的区别WriterState单子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)