在GHCI中,如果运行:
import Data.Binary
encode [1]
一切顺利。但是,如果你运行:
import Data.Vector.Binary
encode [1]
你会收到一条错误消息:
二进制[t0]的重叠实例由使用"编码"引起
匹配实例:
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=编码[1]
GHC似乎认为我的列表是一个向量类型,而不是列表。为什么?
如果头匹配,则类型类匹配不会回溯。实例头
Binary (v a)
表示"对于任何类型v: * -> *
和类型a:*
匹配Binary (v a)
。"因此[] a
匹配。Data.Vector
中的实例可能比它应该的更通用。OverlappingInstances扩展允许您通过选择"最具体的实例"来解决类似的情况,在这种情况下,它显然是[a]
。
IMO,Haskell应该提供一个控制实例范围的机制,以帮助防止类似的问题,但它没有。