当我尝试使用GHC 7.10.3编译以下代码时,它会抛出一个"重叠实例"我的错误:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
module Main where
class Bar a where
bar :: Foo a
-- Instance #1
instance Bar '[a] where
bar = C1
-- Instance #2
instance (Bar as) => Bar (a ': as) where
bar = C2 bar
data Foo :: [*] -> * where
C1 :: Foo '[a]
C2 :: Foo as -> Foo (a ': as)
main :: IO ()
main = undefined
foobar :: Foo '[Int]
foobar = bar
28 col 10错误:因使用'bar'而导致Bar' [Int]的重叠实例
匹配实例:
实例Bar' [a] - 在test.hs中定义:13:10
实例Bar as => Bar(a:as) - 在test.hs中定义:17:10
在表达式中:bar
在'foobar'的等式中:foobar = bar
显然'[Int]
是Bar
到#1
的一个实例。现在我感到很惊讶,因为(根据我对位置的理解)'[Int] = (Int ': '[])
不能是Bar
到#2
的实例,因为'[]
本身不是{{1}的实例(这是必需的)。我对于实体化的限制并不是我认为的那种模糊记忆,我怀疑这里的问题在于Bar
,尽管我无法确定。任何帮助表示赞赏。
答案 0 :(得分:2)
Chris Done撰写了一篇关于此事的博文:
http://chrisdone.com/posts/haskell-constraint-trick
他做出了这样的观察:
实例的约束与决定是否从可用实例列表中选择实例无关。限制仅适用于GHC已经决定使用此实例后。
所以约束存在于:
instance Bar as => Bar (a ': as)
并不排除GHC将其与'[Int]
匹配。