ron*_*ron 23 monads haskell lazy-evaluation
浏览Hackage时,大多数monad都有Lazy和Strict版本.有什么区别?你能用一些常见的monad(State,Reader,Writer)的例子来突出它吗?
Dan*_*her 34
我不知道一个分离成懒惰和严格的读者单子,为的原因State(T)而Writer(T)分离并不存在适用.
懒惰和严格Writer和Statemonads 之间的区别.他们的单子变压器是一元结合的实施(>>=),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的堆积,从而导致空间和/或时间泄漏.
因此,提供了两种变体,您可以选择更适合您需求的变体.