この重複するインスタンスのエラー メッセージに困惑しています。申し訳ありませんが、これは重要なプロジェクトですが、エラーは型シグネチャに対してローカルである必要があります。
まず、 fが特定の型であることを宣言します。
let f = undefined :: (CompNode Int)
次に、関数を呼び出そうとしますpshow :: PrettyShow a => a -> String
。このエラー メッセージが表示されます。
> pshow f
<interactive>:1:1:
Overlapping instances for PrettyShow (CompNode Int)
arising from a use of `pshow'
Matching instances:
instance (G.Graph g, PrettyShow (G.Vertex g)) => PrettyShow g
-- Defined at Graph.hs:61:10-57
instance (PrettyShow a, Show a) => PrettyShow (CompNode a)
-- Defined at Interpreter.hs:61:10-58
問題はCompNode Int
グラフではないことです。そのため、最初に一致したインスタンスがトリガーされるべきではないと思います。(2 つ目は実行したいものです。) 実際、引数がグラフであることを必要とする関数を作成すると、
> :{
| let g :: G.Graph a => a -> a
| g = id
| :}
fでそれを呼び出すと、予想される no instance エラー メッセージが表示されます。
> g f
<interactive>:1:1:
No instance for (G.Graph (CompNode Int))
事前に感謝します。クラウドソーシングで申し訳ありません。GHC 7.0.4 を使用しています。