【发布时间】:2012-11-01 22:31:23
【问题描述】:
浏览 Hackage 时,大多数 monad 都有 Lazy 和 Strict 版本。究竟有什么区别?您能否通过一些常见 monad(State、Reader、Writer)的示例来强调它?
【问题讨论】:
标签: haskell monads lazy-evaluation
浏览 Hackage 时,大多数 monad 都有 Lazy 和 Strict 版本。究竟有什么区别?您能否通过一些常见 monad(State、Reader、Writer)的示例来强调它?
【问题讨论】:
标签: haskell monads lazy-evaluation
我不知道对于 reader monad 的惰性和严格分离,State(T) 和 Writer(T) 分离的原因不适用于那里。
惰性和严格 Writer 和 State monad 的区别。他们的 monad 转换器是 monadic bind (>>=), fmap 等的实现。在严格的版本中,实现模式匹配对((result, state),resp。(result, message)),强制其评估(不是对其组件的评估),而惰性版本在那里使用无可辩驳的模式~(a,w),这不会强制评估该对。
惰性版本允许一些严格版本无法使用的应用程序,例如
foo = do
xs <- take 100 `fmap` sequence (repeat someAction)
doSomethingWith xs
只有当 monad 的 (>>=) 足够懒惰时,无限列表中的 sequence 才能开始传递其结果。
另一方面,使用惰性版本通常会导致在 (result, state) 对中积累大量 thunk,从而导致空间和/或时间泄漏。
因此提供了两种变体,您可以选择更适合您需求的变体。
【讨论】: