次のクラスがあるとします。
class P a where
nameOf :: a -> String
このクラスのすべてのインスタンスが自動的に のインスタンスになることを宣言したいと思いますShow
。私の最初の試みは次のとおりです。
instance P a => Show a where
show = nameOf
昨日、この方法を最初に試みた結果、言語拡張のウサギの群れが発生しました。最初に柔軟なインスタンスをオンにするように言われ、次に決定不能なインスタンスをオンにするように言われ、次にインスタンスをオーバーラップさせ、最後にインスタンス宣言のオーバーラップに関するエラーが発生しました。私はあきらめて、コードの繰り返しに戻りました。ただし、これは基本的に非常に単純な要求のように思われ、簡単に満たされるはずです。
だから、2つの質問:
- 私が見逃したばかりの簡単な方法はありますか?
- 重複インスタンスの問題が発生するのはなぜですか? パターソンの条件に違反しているように見えるので、なぜ が必要なのかがわかり
UndecidableInstances
ますが、ここには重複するインスタンスはありません。 のインスタンスP
さえありません。Show Double
タイプチェッカーは、 (このおもちゃの例の場合のように)の複数のインスタンスがあると考えるのはなぜですか?