2

私は今、「モナドのすべて」が説明しているエラーモナドについて本当に混乱しています。

エラーモナドの定義を次のように主張しています

class (Monad m) => Monaderror e m | m -> e where
  throwError :: e -> m a
  catchError :: m a -> (e -> m a) -> m a

そして、インスタンスの1つはEithereです。

instance MonadError (Either e) where
  throwError = Left
  (Left e) `catchError` handler = handler e
  a        `catchError` _       = a

これが私が理解していないことです。MonadErrorクラスは2つの型パラメーターを取り、(どちらか)は1つを取りますが、このインスタンス化はどのように機能しますか?これは機能依存性のためですか?まだわかりません。

と!このコードをGHCiで実行しました(-XFunctionalDependencies、-XMultiParamTypeClassesを使用)はコンパイルされませんでした!とにかく、このコードは何ですか?

4

1 に答える 1

8

これは単なるタイプミスであり、インスタンスは

instance MonadError e (Either e) where
  throwError = Left
  (Left e) `catchError` handler = handler e
  a        `catchError` _       = a

予想どおり、2つのタイプパラメータを使用します。

Either eはモナドでありe、対応するエラータイプです。

于 2012-10-18T13:07:23.080 に答える