親愛なるハスケル/ GHCの専門家単一のものを可能にしながら、報告の重複の場合、ハスケル/ GHC:コンテキストのみ
一方のみを提供し、コンテキストに従って、実際に有効である一方、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)
がC
のインスタンスではありませんどの(Char, Bool)
を入力していることです。したがって、[('a', True)]
にはinstance C a => C [a]
が適用されません。
したがって、なぜGHCはそれを考慮しますか?
問題は実際にGHCの動作を理解することであり、問題を回避する方法(例:OverlappingInstances
を使用)ではありません。なぜなら、コンテキストコールは関数呼び出しを "解決"するときに使用されないからですか?もしそうなら、なぜですか?
ありがとうございます!
ありがとうShree。だから、基本的には、この(非標準的な)拡張では単に「GHCの仕組み」のように見えます。私はその質問を閉じます。 –