Data.Vector.Binary阻止对列表进行编码.这是GHC错误吗



在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应该提供一个控制实例范围的机制,以帮助防止类似的问题,但它没有。

最新更新