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:
- Ich dachte
OverlappingInstances
würde mir erlauben, zu lösen die Instanz, aber ich bekomme den gleichen Fehler. IncoherentInstances
sollte definitiv lassen Sie mich kompilieren ... richtig? Aber das tut es nicht.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.