浏览 Hackage 时,大多数 monad 都有 Lazy 和 Strict 版本。究竟有什么区别?你能用一些常见的单子(State、Reader、Writer)的例子来强调它吗?
问问题
1921 次
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 回答