私はaccelerateライブラリからインポートされたモジュールに(Data.Tagged)タイプのものをshow
しようとしています。残念ながら、アクセラレータライブラリは、Showインスタンスを定義します。外部ライブラリで重複するインスタンスを解決する
instance Kit acc => Show (acc aenv a) where
in Data.Array.Accelerate.Pretty.hs少し読んでみると、このインスタンスのインポートを避けるために何もできません。明らかにData.Taggedインスタンスと重複しています。Show
インスタンス。 実際、ジェネリックアクセラレーションインスタンスでは、*->*->*
の何ものも印刷できません。
- 私は
OverlappingInstances
は私が解決できるようにするだろうと思った:私はいくつかの質問を持っているOverlapping instances for Show (Tagged * Int Int) arising from a use of `print' Matching instances: instance Show b => Show (Tagged k s b) -- Defined in `Data.Tagged' instance [overlap ok] accelerate-0.13.0.5:Data.Array.Accelerate.Trafo.Base.Kit acc => Show (acc aenv a) -- Defined in `Data.Array.Accelerate.Pretty'
:
{-# LANGUAGE FlexibleContexts, OverlappingInstances, IncoherentInstances #-} import Data.Array.Accelerate import Data.Tagged main :: (Show (Tagged Int Int)) => IO() main = let x = Tagged 3 in print (x::Tagged Int Int)
エラー:
はここで、問題を示し、簡単な例を示しますインスタンスが、私は同じエラーが発生します。
IncoherentInstances
間違いなく私はコンパイルできますか?しかし、それはしません。私は私ができるだけであった場所の前に見ていると信じてinstance Show b => Show (Tagged s b) where
:(Data.Taggedからコピーされた)インスタンスがあるとき
はなぜGHCレポートはData.TaggedはShow (Tagged k s b)
としてインスタンスを示してい(GHCに最も特定のインスタンスを選択させるように)明示的な型シグネチャを追加することによって重複するインスタンスを解決することができますが、私の例はトップレベルにあり、多態性を伴わないため、タイプ。
私の印象は、私は、我々は唯一のRHSに一致して知っている(と思う)Tagged
がAccelerate.Base.Kit
のインスタンスではありませんので、インスタンスの制約を満たしていない(ので、GHCがData.Taggedインスタンスを選択することができなければならないことですインスタンスが、GHCは)...インスタンスのいずれかが、おそらく適用されなかったことを把握することができるはずです
EDIT
私はバグレポートhereを作成し、問題のインスタンスが削除されましたレポの頭に下の#3への大きな答えがありますが、私はまだOverlappingInstances
/IncoherentInstances
がうまくいかなかった理由を知りたいと思っています。型は型変数の種類にと制限なしでコンパイルされた場合