23

Hackageを閲覧する場合、ほとんどのモナドにはLazyバージョンとStrictバージョンがあります。正確な違いは何ですか?一般的なモナド(State、Reader、Writer)の例でそれを強調できますか?

4

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