在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认为我的列表是矢量类型而不是列表。那是为什么?
答案 0 :(得分:3)
如果头部匹配,则类型类匹配不会回溯。实例头
Binary (v a)
表示“对于任何类型v: * -> *
并键入a:*
匹配Binary (v a)
。”因此[] a
匹配。 Data.Vector
中的实例可能比它应该更普遍。 OverlappingInstances扩展允许您通过选择“最具体的实例”来解决此类情况,在这种情况下显然是[a]
。
IMO,Haskell应该提供一种机制来控制实例的范围,以帮助防止这样的问题,但事实并非如此。