Data.Vector.Binary可防止列表编码。这是GHC的错误吗?

时间:2012-07-25 23:29:10

标签: 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 `Data.Vector.Binary'

 instance Binary a => Binary [a] -- Defined in `Data.Binary'
     

在表达式中:encode [1]

     

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

似乎GHC认为我的列表是矢量类型而不是列表。那是为什么?

1 个答案:

答案 0 :(得分:3)

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

 Binary (v a)

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

IMO,Haskell应该提供一种机制来控制实例的范围,以帮助防止这样的问题,但事实并非如此。