[英]Difference between Haskell's Lazy and Strict monads (or transformers)
瀏覽Hackage時,大多數monad都有Lazy和Strict版本。 有什么區別? 你能用一些常見的monad(State,Reader,Writer)的例子來突出它嗎?
我不知道對於讀者monad的分離是懶惰和嚴格的, State(T)
和Writer(T)
分離的原因不適用於那里。
惰性和嚴格的Writer
和State
monads之間的區別。 他們的monad變換器是fmap
bind (>>=)
, fmap
等的實現。在嚴格版本中,實現模式匹配對( (result, state)
,resp。 (result, message)
),強制它評估( 不是對其組件的評估),而懶惰版本使用無可辯駁的模式~(a,w)
,這不會強制評估該對。
惰性版本允許一些嚴格版本不可能的應用程序,例如
foo = do
xs <- take 100 `fmap` sequence (repeat someAction)
doSomethingWith xs
如果monad的(>>=)
足夠懶惰,則無限動作列表的sequence
只能開始傳遞其結果。
另一方面,使用惰性版本通常會導致在(result, state)
對中形成大的thunks,從而導致空間和/或時間泄漏。
因此,提供了兩種變體,您可以選擇更適合您需求的變體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.