Haskell Data.Vector.Binary阻止列表编码。这是GHC bug吗?
在GHCI中,如果运行: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 `
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应该提供一种机制来控制实例的范围,以帮助防止此类问题,但事实并非如此