8

私はaccelerateライブラリからインポートされたモジュールに(Data.Tagged)タイプのものをshowしようとしています。残念ながら、アクセラレータライブラリは、Showインスタンスを定義します。外部ライブラリで重複するインスタンスを解決する

instance Kit acc => Show (acc aenv a) where 

in Data.Array.Accelerate.Pretty.hs少し読んでみると、このインスタンスのインポートを避けるために何もできません。明らかにData.Taggedインスタンスと重複しています。Showインスタンス。 実際、ジェネリックアクセラレーションインスタンスでは、*->*->*の何ものも印刷できません。

  1. 私は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) 
    

    エラー:

    はここで、問題を示し、簡単な例を示しますインスタンスが、私は同じエラーが発生します。

  2. IncoherentInstances間違いなく私はコンパイルできますか?しかし、それはしません。私は私ができるだけであった場所の前に見ていると信じて

    instance Show b => Show (Tagged s b) where 
    

:(Data.Taggedからコピーされた)インスタンスがあるとき

  • はなぜGHCレポートはData.TaggedはShow (Tagged k s b) としてインスタンスを示してい(GHCに最も特定のインスタンスを選択させるように)明示的な型シグネチャを追加することによって重複するインスタンスを解決することができますが、私の例はトップレベルにあり、多態性を伴わないため、タイプ。

    私の印象は、私は、我々は唯一のRHSに一致して知っている(と思う)TaggedAccelerate.Base.Kitのインスタンスではありませんので、インスタンスの制約を満たしていない(ので、GHCがData.Taggedインスタンスを選択することができなければならないことですインスタンスが、GHCは)...インスタンスのいずれかが、おそらく適用されなかったことを把握することができるはずです

    EDIT

    私はバグレポートhereを作成し、問題のインスタンスが削除されましたレポの頭に下の#3への大きな答えがありますが、私はまだOverlappingInstances/IncoherentInstancesがうまくいかなかった理由を知りたいと思っています。型は型変数の種類に​​と制限なしでコンパイルされた場合

  • 答えて

    5

    私は唯一の3

    に答えを知っている、GHCは非常に悪いタイプを出力します。型名の後には、すべての多型変数の種類のリスト、型変数のリストが出力されます。したがって、タイプシグネチャに現れるkは、タイプ変数sがどんな種類のものであってもよいことを意味します。 (使用方法のため、bには種類が*である必要があります。そのため多種多態ではないため、その種類はリストされていません。それはあまりにも、昇格5タプルを使用しています

    (SingI Nat a, SingI Nat b, SingI Nat c, SingI Nat d, SingI Nat e) => StaticSize ((,,,,) Nat Nat Nat Nat Nat) ((,,,,) Nat Nat Nat Nat Nat a b c d e) 
    

    )これは得ることができますどのようにばかげの例として

    は、ここに..私は今働いているライブラリのハドックのドキュメントからの例です。それはタプルが種類と型の両方で現れることを意味するので、ちょっとばかげています。

    関連する問題