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 に答える