簡體   English   中英

Haskell的Lazy和Strict monad(或變形金剛)之間的區別

[英]Difference between Haskell's Lazy and Strict monads (or transformers)

瀏覽Hackage時,大多數monad都有Lazy和Strict版本。 有什么區別? 你能用一些常見的monad(State,Reader,Writer)的例子來突出它嗎?

我不知道對於讀者monad的分離是懶惰和嚴格的, State(T)Writer(T)分離的原因不適用於那里。

惰性和嚴格的WriterState 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM