Hackageを閲覧する場合、ほとんどのモナドにはLazyバージョンとStrictバージョンがあります。正確な違いは何ですか?一般的なモナド(State、Reader、Writer)の例でそれを強調できますか?
1921 次
1 に答える
35
読者モナドの怠惰と厳格への分離については知りません。分離の理由はそこState(T)
にWriter(T)
は当てはまりません。
Writer
怠惰なものと厳格なものとState
モナドのそれぞれの違い。それらのモナド変換子は、モナドバインドなどの実装です(>>=)
。厳密なバージョンでは、実装はペア( 、resp。 )でfmap
パターン一致し、その評価(コンポーネントの評価ではない)を強制しますが、レイジーバージョンではそこに反駁できないパターンがあり、ペアの評価を強制しません。(result, state)
(result, message)
~(a,w)
レイジーバージョンでは、厳密なバージョンでは不可能な一部のアプリケーションが許可されます。
foo = do
xs <- take 100 `fmap` sequence (repeat someAction)
doSomethingWith xs
アクションのsequence
無限のリストの(>>=)
は、モナドのが十分に怠惰である場合にのみ、その結果の配信を開始できます。
一方、レイジーバージョンを使用すると、(result, state)
ペアに大きなサンクが蓄積し、スペースや時間のリークが発生することがよくあります。
そのため、両方のバリエーションが提供されており、ニーズに合ったものを選択できます。
于 2012-11-01T22:55:22.013 に答える