不清楚为什么实例重叠

时间:2016-05-29 21:30:58

标签: haskell functional-programming

当我尝试使用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,尽管我无法确定。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

Chris Done撰写了一篇关于此事的博文:

http://chrisdone.com/posts/haskell-constraint-trick

他做出了这样的观察:

  

实例的约束与决定是否从可用实例列表中选择实例无关。限制仅适用于GHC已经决定使用此实例后。

所以约束存在于:

instance Bar as => Bar (a ': as)

并不排除GHC将其与'[Int]匹配。