【问题标题】:Difference between Haskell's Lazy and Strict monads (or transformers)Haskell 的 Lazy 和 Strict monad(或转换器)之间的区别
【发布时间】:2012-11-01 22:31:23
【问题描述】:

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

【问题讨论】:

    标签: haskell monads lazy-evaluation


    【解决方案1】:

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

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

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

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

    只有当 monad 的 (&gt;&gt;=) 足够懒惰时,无限列表中的 sequence 才能开始传递其结果。

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

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

    【讨论】:

    • 对于感兴趣的人,monad 中可能的副作用可能仍然很严格。参见例如this gist(在 state monad 中研究 state 的严格性,不必要的 MD)
    猜你喜欢
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2011-08-18
    • 2019-03-20
    • 2011-05-19
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多