2016-04-16 5 views
4

私はモナドに精通しています。 Reader,ErrorおよびState。しかし、トランスフォーマーは私にとって非常に新しいものです。2つのモナド変圧器の違いは何ですか?

これら二つのモナド変圧器が違う何

ReaderT Env (ErrorT String (StateT Integer Identity)) a 

ReaderT Env (StateT Integer (ErrorT String Identity)) a 

...直感的に、私は、以下の2つのモナド変圧器との間に差がある伝えることができますが、私はかなりそれが何であるかを特定することはできませんか?簡単にするため

答えて

5

、(自明同じではない)のみ関連する部分を比較:

MaybeT (StateT Integer Identity) a 
StateT Integer (MaybeT Identity) a 

我々は(はnewtype抽象化を無視する)ことを知っている

したがって
type MaybeT m a = m (Maybe a) 
type StateT s m a = s -> m (a, s) 

、2つのトランススタックが出てくる

MaybeT (Λb. Integer -> (b, Integer)) a 
    ≡ Integer -> (Maybe a, Integer) 

StateT Integer (Λb. Maybe b) a 
    ≡ Integer -> Maybe (a, Integer) 

したがって、これらは全く同じではありません。違いは、後者がMaybeの内部にある状態整数のみを生成することです。これは、MaybeTがスタック内にダウンしている場合、Nothingを取得するとただちに計算を終了する必要がありますが、MaybeTが上に使用されていれば、Stateはまだ動作し続けることができます。

これは、より抜本的なIOである:あなたが例外を得れば、あなたはおそらく唯一自体IOでキャッチすることができ–例外を続行できませんすることができます。これは、IOT変圧器がない理由の1つです。

1
ReaderT Env (ErrorT String (StateT Integer Identity)) a 
ReaderT Env (StateT Integer (ErrorT String Identity)) a 

簡潔には第二のエラーがEnvInteger状態の両方に依存することを可能にしながらのみ、Env入力に依存する最初のエラーで、置きます。

関連する問題