Haskellでのエラー処理について(ErrorT, ExceptT)

Haskellインタプリタhttps://github.com/koba-e964/experiment/tree/master/typeinf )を書いていて、エラー処理をしたくなったのでモナド変換子ErrorTを導入しました。その後別の環境でコンパイルしてみたら

(前略) Use Control.Monad.Except instead (後略)

 と怒られてしまったのでびっくりして確認すると、どうやらmtlのバージョンがエラー処理を書いた環境は2.0以前、別の環境では2.2.0.1(2.2.1かも?記憶があいまい)だったのが原因だったようです。

このControl.Monad.Exceptというモジュールは、ここ2週間くらい前(2014/6/2)にリリースされたmtl-2.2.1 ( http://hackage.haskell.org/package/mtl-2.2.1 )で新たに導入されたようです。

 

新しく導入されたモナド変換子ExceptTと、以前からあったErrorT (Control.Monad.Error)との違いですが、見たところ型変数eに関する制約が無くなったというのが唯一の違いであるように思われます。ErrorTの各種インスタンス宣言には、

(Monad m, Error e) => MonadError e (ErrorT e m)

(Monad m, Error e) => Monad (ErrorT e m)

のように、Error eという宣言が必要でしたが、ExceptTのインスタンス宣言には必要ありません。(例:

Monad m => MonadError e (ExceptT e m)

Monad m => Monad (ExceptT e m)

など)