1

GHCI で以下を実行すると:

import Data.Binary
encode [1]

すべてがスムーズに機能します。ただし、次に実行すると:

import Data.Vector.Binary
encode [1]

次のエラー メッセージが表示されます。

「encode」の使用に起因する Binary [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 = エンコード [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 に答える