Haskell Data.Vector.Binary阻止列表编码。这是GHC bug吗?

Haskell Data.Vector.Binary阻止列表编码。这是GHC bug吗?,haskell,Haskell,在GHCI中,如果运行: import Data.Binary encode [1] 一切顺利。但是,如果您随后运行: import Data.Vector.Binary encode [1] 您将收到一条错误消息: 二进制[t0]的重叠实例 因使用“encode”而产生 匹配实例: instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a) -- Defined in `

在GHCI中,如果运行:

import Data.Binary
encode [1]
一切顺利。但是,如果您随后运行:

import Data.Vector.Binary
encode [1]
您将收到一条错误消息:

二进制[t0]的重叠实例 因使用“encode”而产生

匹配实例:

 instance (Data.Vector.Generic.Base.Vector v a, Binary a) =>
          Binary (v a)
   -- Defined in `Data.Vector.Binary'

 instance Binary a => Binary [a] -- Defined in `Data.Binary'
在表达式中:encode[1]

在“it”的等式中:it=encode[1]


似乎GHC认为我的列表是向量类型而不是列表。为什么会这样?

如果头部匹配,类型类匹配不会回溯。实例的头部

 Binary (v a)
表示“对于任何类型
v:*
和类型
a::
匹配
Binary(va)
”,因此
[]a
匹配。
Data.Vector
中的实例可能比它应该的更一般。OverlappingInstances扩展允许您通过选择“最具体的实例”(在本例中,该实例显然是
[a]
)来解决此类情况

在国际海事组织(IMO)看来,Haskell应该提供一种机制来控制实例的范围,以帮助防止此类问题,但事实并非如此