Haskell的Lazy和Strict monad(或变形金刚)之间的区别

时间:2012-11-01 22:31:24

标签: haskell monads lazy-evaluation

浏览Hackage时,大多数monad都有Lazy和Strict版本。有什么区别?你能用一些常见的monad(State,Reader,Writer)的例子来突出它吗?

1 个答案:

答案 0 :(得分:34)

我不知道对于读者monad的分离是懒惰和严格,State(T)Writer(T)分离的原因不适用于那里。

懒惰和严格WriterState 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的堆积,从而导致空间和/或时间泄漏。

因此提供了两种变体,您可以选择更适合您需求的变体。