親愛なる Haskell/GHC 専門家の皆様
提供されたコンテキストに従って実際に有効なのは1つだけなのに、GHCが重複するインスタンスを報告する理由がよくわかりません。たとえば、次のコードを考えてみましょう。
{-# LANGUAGE FlexibleInstances #-}
class C a where
foo :: a -> String
foo x = "OK"
instance C Bool
instance (C a) => C [a]
instance (C a) => C [(Char, a)]
main = print $ foo [('a', True)]
それをコンパイルすると、次のようになります。
Test.hs:13:16: error:
* Overlapping instances for C [(Char, Bool)]
arising from a use of `foo'
Matching instances:
instance C a => C [a] -- Defined at Test.hs:9:10
instance C a => C [(Char, a)] -- Defined at Test.hs:11:10
* In the second argument of `($)', namely `foo [('a', True)]'
In the expression: print $ foo [('a', True)]
In an equation for `main': main = print $ foo [('a', True)]
ポイントは、のインスタンスではない('a', True)
型を持つことです。したがって、値には適用されません。(Char, Bool)
C
instance C a => C [a]
[('a', True)]
では、なぜGHCはそれを考慮するのでしょうか?
問題は、問題を回避する方法 (例: を使用) ではなく、GHC の動作を理解することOverlappingInstances
です。関数呼び出しを「解決」するときにコンテキストが使用されていないためですか?もしそうなら、なぜですか?
前もって感謝します!