2013-04-11 10 views
17

変圧器の "標準"バージョンを使用するのではなく、アイデンティティモナドでモナド変圧器を使用する際のポイントは何ですか?アイデンティティモナドを持つモナド変圧器

もっと柔軟ですか?

+0

「標準」バージョンとはどういう意味ですか? – Adrian

+0

「トランスの標準バージョン」とはどういう意味ですか?通常、アイデンティティモナドに適用されるトランスの標準バージョンです。 – leftaroundabout

+0

私は 'StateT s Identity a'と' State s a'を意味します。どちらも機能的には同じですか? –

答えて

30

はしかし、これはMonadState努力を複製巻き上げるようなもののためのインスタンスを実装しなければならなかった誰を意味しました。

transformers

(今消滅monads-fdmonads-tf)ロスパターソンは後者のみを提供し、ベースモナドとしてIdentityを使用する簡単な方法を使用することを決めました。

これにより、mtlを維持するための実装の労力が軽減され、Stateモナドを実装する2つの異なる方法があるという事実が削除されました。しかし、mtlの内部を教えるのが難しくなりました。なぜなら、ゲートのすぐ外にあるtransformersバージョンを理解する必要があり、単純化されたバージョンをトレーニングホイールとして使用しないからです。

mtlが廃止され、monads-fdmtl 2.0になったとき、既存のtransformersを使用してこの設計決定を引き継いだ。

私は個人的には、少なくとも教育的目的のための別個の単純なモナドを好きでしたが、議論の反対側にははるかに多くの人がいました。

+5

私は教育目的について全く同意します。元のよりシンプルなバージョンを含む 'monads-teach'パッケージをセットアップするべきでしょう。 –

11

ドキュメントから:計算上、単純に引数に関数を適用するのではなく、アイデンティティモナドを使用する理由はありません。アイデンティティモナドの目的は、モナド変圧器の理論における基本的な役割です。アイデンティティモナドに適用されたモナド変換器は、そのモナドの非変換バージョンを生成します。

私が理解しているように、モナド変圧器からのモナドの非変圧器バージョンを識別モナドを適用することによって得ることは、アイデンティティモナドが存在することとまったく同じです。非変圧器モナドを使用するだけでは利点はありませんが、モナド変圧器を使用する必要があることもあります。あなたが使用したい機能がそれを必要とするとき。我々は

newtype State s a = State { runState :: s -> (a, s) } 

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } 

の両方を持っていた

戻る mtl 1.0で
関連する問題