1

在 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'

在表达式中:编码 [1]

在 `it' 的等式中:it = encode [1]

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

4

1 回答 1

3

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

 Binary (v a)

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

IMO,Haskell 应该提供一种控制实例范围的机制,以帮助防止此类问题,但它没有。

于 2012-07-25T23:38:09.147 回答