23

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

4

1 回答 1

35

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

Writer懒惰和严格与State单子之间的区别。他们的 monad 转换器是 monadic bind 等的实现(>>=)fmap在严格版本中,实现模式匹配对 ( (result, state), resp. (result, message)),强制其评估(而不是对其组件的评估),而惰性版本使用那里有无可辩驳的模式~(a,w),这不会强制评估该对。

惰性版本允许一些严格版本无法使用的应用程序,例如

foo = do
    xs <- take 100 `fmap` sequence (repeat someAction)
    doSomethingWith xs

只有在 monad 足够懒惰的情况下,无限动作列表的 thesequence才能开始传递其结果。(>>=)

另一方面,使用惰性版本通常会导致(result, state)成对中大量 thunk 的累积,从而导致空间和/或时间泄漏。

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

于 2012-11-01T22:55:22.013 回答