Auflösung überlappender Instanzen in der externen Bibliothek

8

Ich versuche show etwas vom Typ Tagged s b ( Data.Tagged ) in einem Modul, das auch aus der -Bibliothek importiert . Leider definiert die accelerate-Bibliothek die show-Instanz

%Vor%

in Data.Array.Accelerate.Pretty.hs. Wenn ich etwas herum lese, kann ich nichts tun, um den Import dieser Instanz zu vermeiden, die sich offensichtlich mit der Instanz Data.Tagged Show überschneidet. Tatsächlich verhindert die generische beschleunigende Instanz, dass ich nichts von der Art *->*->* drucken kann.

Hier ist ein einfaches Beispiel, das das Problem demonstriert:

%Vor%

Der Fehler:

%Vor%

Ich habe ein paar Fragen:

  1. Ich dachte, OverlappingInstances würde mir erlauben, die Instanz aufzulösen, aber ich bekomme denselben Fehler.
  2. IncoherentInstances sollte definitiv lassen Sie mich kompilieren ... richtig? Aber das tut es nicht.
  3. Warum meldet GHC die Show-Instanz "Data.Tagged" als Show (Tagged k s b) ? wenn die Instanz (kopiert von Data.Tagged):

    ist %Vor%

Ich glaube, ich habe schon einmal gesehen, dass ich überlappende Instanzen nur durch Hinzufügen einer expliziten Typsignatur auflösen konnte (um GHC zur Auswahl der spezifischsten Instanz zu zwingen), aber da mein Beispiel auf der obersten Ebene ist und keinen Polymorphismus beinhaltet, Ich weiß nicht, wie viel expliziter ich über die Typen sein kann.

Mein Eindruck ist, dass GHC in der Lage sein sollte, die Data.Tagged-Instanz zu wählen, da (ich denke) Tagged keine Instanz von Accelerate.Base.Kit ist und daher die Instanzbeschränkungen nicht erfüllt (ich weiß, dass wir nur anpassen die RHS der Instanz, aber GHC sollte in der Lage sein herauszufinden, dass eine der Instanzen möglicherweise nicht anwendbar sein könnte ...)

BEARBEITEN

Ich habe hier einen Fehlerbericht erstellt, und die beanstandete Instanz wird jetzt im Repokopf entfernt. Es gibt eine großartige Antwort auf # 3 unten, aber ich bin immer noch interessiert zu wissen, warum OverlappingInstances / IncoherentInstances nicht funktioniert hat.

    
crockeea 06.08.2013, 03:37
quelle

1 Antwort

5

Ich kenne nur die Antwort auf 3.

Wenn ein Typ mit -XPolyKinds und keiner Einschränkung für die Art einer Typvariablen 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 also, dass die Typvariable s beliebiger Art sein kann. (Aufgrund der Art und Weise, wie es verwendet wird, muss b eine Art * haben, also ist es nicht polymorph, also wird seine Art nicht aufgelistet.)

Als Beispiel, wie lächerlich das werden kann, hier ist ein Beispiel aus den Schellendokumenten einer Bibliothek, an der ich gerade arbeite.

%Vor%

Es wird auch ein befördertes 5-Tupel verwendet. Das macht es nur extra-albern, weil das bedeutet, dass das Tupel sowohl in der Art als auch im Typ auftaucht.

    
Carl 06.08.2013, 05:29
quelle