8

Ich versuche, show etwas vom Typ Tagged s b (Data.Tagged) in einem Modul, das auch aus der accelerate Bibliothek importiert. Leider definiert die Beschleunigung der Bibliothek der Show InstanzAuflösen überlappender Instanzen in der externen Bibliothek

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

in Data.Array.Accelerate.Pretty.hs. Wenn ich etwas herumlese, kann ich nichts tun, um den Import dieser Instanz zu vermeiden, die sich offensichtlich mit der Data.Tagged Show Instanz überschneidet. In der Tat verhindert die generische beschleunige Instanz, dass ich nichts von der Art *->*->* drucken kann.

Hier ist ein einfaches Beispiel, das das Problem veranschaulicht:

{-# 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) 

Der Fehler:

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' 

Ich habe ein paar Fragen:

  1. Ich dachte OverlappingInstances würde mir erlauben, zu lösen die Instanz, aber ich bekomme den gleichen Fehler.
  2. IncoherentInstances sollte definitiv lassen Sie mich kompilieren ... richtig? Aber das tut es nicht.
  3. Warum GHC Bericht der Data.Tagged zeigen Instanz als Show (Tagged k s b) , wenn die Instanz (von Data.Tagged kopiert) ist:

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

Ich glaube, ich vorher gesehen habe, wo ich war nur in der Lage überlappende Instanzen durch Hinzufügen einer expliziten Typsignatur aufzulösen (um GHC zu zwingen, die spezifischste Instanz zu wählen), aber da mein Beispiel auf der obersten Ebene ist und keinen Polymorphismus beinhaltet, weiß ich nicht, wie viel expliziter ich über die. sein kann Arten.

Mein Eindruck ist, dass GHC der Lage sein sollte, die Data.Tagged Instanz zu wählen, da (glaube ich) Tagged keine Instanz von Accelerate.Base.Kit ist und daher nicht die Instanz Einschränkungen nicht erfüllt (Ich weiß, dass wir nur auf der RHS entsprechen der die Instanz, aber GHC sollte, um herauszufinden, die Lage sein, dass eine der Instanzen könnte möglicherweise nicht anwenden ...)

EDIT

ich einen Fehlerbericht erstellt here und die säumige Instanz wird nun entfernt im Repokopf. Es gibt eine gute Antwort auf # 3 unten, aber ich bin immer noch interessiert zu wissen, warum OverlappingInstances/IncoherentInstances nicht funktioniert hat.

Antwort

5

Ich kenne nur die Antwort auf 3.

Wenn ein Typ mit -XPolyKinds und keine Beschränkung der Art einer Variable vom Typ kompiliert wird, druckt GHC den Typ sehr schlecht. Nach dem Typnamen wird eine Liste von Arten aller polymorphen Typvariablen und dann der Typvariablen ausgegeben. Die k, die in der Typ-Signatur angezeigt wird, bedeutet, dass die Typvariable s jeder Art sein kann. (Aufgrund der Art, wie es verwendet wird, b muss Art * haben, so ist es nicht freundlich-polymorph, so dass seine Art nicht aufgeführt ist.

)

Als Beispiel dafür, wie lächerlich diese zu bekommen, hier ein Beispiel aus dem Schellfisch docs eine Bibliothek, die ich jetzt gerade arbeite ..

(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) 

Es ist ein gefördert 5-Tupel mit, auch. Das macht es nur extra-albern, denn das bedeutet, dass das Tupel sowohl in der Art als auch in der Art auftaucht.