2012-03-30 6 views
5

変換されたモナドがインスタンスの場合、モナドトランスをMonadErrorのインスタンスにしたいと思っています。カスタムモナドトランスをMonadErrorのインスタンスにする

MonadError e m => MonadError e (StateT s m) 

私はこれをやってみました::基本的に私は、内蔵の変圧器は、例えばStateTためMonadErrorインスタンスが存在しないと私の変圧器が動作するようにしたい

instance MonadError e m => MonadError e (MyMonadT m) 

は、しかし、GHCは決定不能に文句を開始しました明らかに、MTLライブラリは決定不能なインスタンスを有効にしますが、それを避ける方法はありますか?または、この場合OKですが問題はありませんか?

答えて

8

これは基本的には問題ありません。 UndecidableInstancesはそれほど恐ろしいものではありません。つまり、コンパイラがインスタンスを見つける代わりに、無限ループに入るということです。そのという音を出しているのは、GHCが実際にインスタンスを見つけるのにかかるステップ数に制限があることを理解するまでです。あなたが悪い例を書かない限り、何もうまくいかないでしょう。そして、あなたが得るエラーメッセージは、一般に、何が間違っているのかを非常に明白にします。 確かに、それはOverlappingInstances(または悪い、IncoherentInstances)のようなものよりも怖いことはありません。

MonadErrormからeへの機能依存性を持っているためです。つまり、mの選択によって、が必要であることが決まります。すなわち、すべてmは、1つだけeに関連付けられています。これ(カバレッジ条件)のチェックは保守的なので、このような問題に遭遇するのは簡単です。ここでは、「レベルを再帰的に試してみてください」と指定してeと指定します。

これは、探しているすべてのインスタンスを一覧表示して、探しているインスタンスを検索します。繰り返す行が表示されます。しかし、通常は、最初はこのようなトラブルに遭遇することはありません。

関連する問題