1

モジュール A はモジュール B と C をインポートします

モジュール B はインスタンス X をインポートします

モジュール C はインスタンス Y をインポートします

X と Y は、共通型クラスのインスタンスです。

インスタンス X と Y は同じタイプです。つまり、完全にオーバーラップしています。

B または C を別々に使用すると、すべてが機能します。いくつかの比較テスト (またはベンチマーク) を行うためにそれら (ここでは A) をインポートすると、C 内で X と Y の両方が一致するという重複インスタンス エラーが発生します。

C から X へのパスはC -> A -> B. これが本来あるべき姿ですか?また、これを回避する方法はありますか?通常の状況では 2 つのインスタンスが一緒に使用されることはないため、汚いハックは問題ありません。特にファントムタイプなどは導入したくないです。

4

2 に答える 2

2

そこにあるクラスがどのように見えるかに応じて、2 つの小さなプロキシ モジュールと を使用してこれを修正するのは簡単なPはずQです。ただし、1 つは importingで、もう1 つは importingであるため、実際には異なるインスタンスを使用します。次に、2 つの型があり、同じように動作しますが、前者は X インスタンスを使用し、後者は基になる型の Y インスタンスを使用します。newtype ProxyXYGeneralisedNewtypeDerivingmodule Bmodule CP.ProxyXYQ.ProxyXY

(それが「ファントムタイプ」で意味したものかどうかはわかりませんが、実際には別のものです。)

于 2013-05-18T12:37:52.423 に答える
2

わかりました、これは深刻な答えではありませんが、コードをコンパイルできます。

GHC (7.4.1) か cabal にバグがあると思います。最初のコンパイルは、前述の重複インスタンス エラーで失敗します。しかし、もう一度やり直すと(両方とも を使用してcabal-dev build)成功します!その理由を説明します。

C のコンパイル中に最初のコンパイルが停止したため、C と A はコンパイルされませんでした。コンパイルを再実行すると、最初に C が正常にコンパイルされ、次に A がコンパイルされます。GHC は B から間接インスタンスを取得しないため (C は B に直接依存せず、A はC) の後にコンパイルされます)。

結局のところ、これは部分的なコンパイルによって引き起こされた問題であり、実際には私の問題に対する非常に汚いハックです。

于 2013-05-18T14:31:45.047 に答える