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

ron*_*ron 23 monads haskell lazy-evaluation

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

Dan*_*her 34

我不知道一个分离成懒惰和严格的读者单子,为的原因State(T)Writer(T)分离并不存在适用.

懒惰和严格WriterStatemonads 之间的区别.他们的单子变压器是一元结合的实施(>>=),fmap等等.在严格的版本中,在一对的实施图案匹配((result, state),RESP. (result, message)),迫使它的评价(及其组件的评价),而懒惰版本使用的~(a,w)那里有无可辩驳的模式,它不会强制评估该对.

惰性版本允许一些严格版本不可能的应用程序,例如

foo = do
    xs <- take 100 `fmap` sequence (repeat someAction)
    doSomethingWith xs
Run Code Online (Sandbox Code Playgroud)

sequence动作的无限名单才能开始交付其结果,如果(>>=)单子的足够懒惰.

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

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