亲爱的 Haskell/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)
的类型(Char, Bool)
不是C
. 因此,instance C a => C [a]
不适用于 value [('a', True)]
。
所以,GHC为什么会考虑呢?
问题实际上是关于理解 GHC 的行为,而不是关于如何避免这个问题(例如使用OverlappingInstances
)。是因为“解析”函数调用时不使用上下文吗?如果是这样,为什么?
提前致谢!