浏览Hackage时,大多数monad都有Lazy和Strict版本。有什么区别?你能用一些常见的monad(State,Reader,Writer)的例子来突出它吗?
答案 0 :(得分:34)
我不知道对于读者monad的分离是懒惰和严格,State(T)
和Writer(T)
分离的原因不适用于那里。
懒惰和严格Writer
和State
monad之间的区别。他们的monad变换器是monadic绑定(>>=)
,fmap
等的实现。在严格版本中,实现模式匹配对((result, state)
,resp。(result, message)
),强制进行评估(不评估其组件),而懒惰版本在那里使用无可辩驳的模式~(a,w)
,这不会强制评估该对。
惰性版本允许一些严格版本无法使用的应用程序,例如
foo = do
xs <- take 100 `fmap` sequence (repeat someAction)
doSomethingWith xs
如果monad的sequence
充分懒惰,则无限动作列表的(>>=)
只能开始传递结果。
另一方面,使用惰性版本通常会导致(result, state)
对中大型thunk的堆积,从而导致空间和/或时间泄漏。
因此提供了两种变体,您可以选择更适合您需求的变体。