ich eine Klasse habenLösen von Überlappung von Instanzen mit Typ-Familien
class Monad m => MyClass m where
type MyType1 m
type MyType2 m
...
a :: m (MyType1 m)
b :: m (MyType2 m)
c :: m (MyType3 m)
...
und ich habe auch Bündel von Instanzen, die die Funktionen (a
...) angemessen
instance MyClass A where
type MyType1 A = Int
...
a = ...
...
instance MyClass (B a) where
type MyType1 (B a) = Char
...
a = ...
...
...
implementieren, aber ich habe auch viele Instanzen, die nichts nützliches tun, abgesehen von der Aufhebung der Implementierung durch Transformatoren:
instance MyClass m => MyClass (MyTransA m)
type MyType1 (MyTransA m) = MyType1 m
...
a = lift a
...
instance MyClass m => MyClass (MyTransB m)
type MyType1 (MyTransB m) = MyType1 m
...
a = lift a
...
...
und dies erweist sich als viel vorformulierten sein zu schreiben, also wollte ich diese sich wiederholende uninteressant Instanzen mit einfach
class MonadTrans t => AutoLiftMyClass t
instance (AutoLiftMyClass a, MyClass m) => MyClass (a m)
type MyType1 (a m) = MyType1 m
...
a = lift a
...
die mich nur
instance AutoLiftMyClass MyTransA
instance AutoLiftMyClass MyTransB
...
zu schreiben erlauben würde, ersetzen, die Aufhebung zu erhalten kostenlos, a
, b
, ... für jeden MyTransA
, MyTransB
ist
das Problem
... die Aufzählung aller aufgehoben zu vermeiden, dass aus irgendeinem Grund (I reall Ich weiß nicht, warum) GHC betrachtet nur die RHS von Instanz Deklarationen, also meineAutoLiftMyClass
kollidiert auf Typ Familieninstanzen für
MyType1
, ... mit allen sinnvollen Instanzen
A
,
B
, ... (diejenigen, die keine Instanz von
AutoLiftMyClass
)
Ich habe einige Beiträge und Artikel im Wiki über Closed Type Familien gesehen, aber sie ergeben für mich nicht viel Sinn. Gibt es eine Möglichkeit, wie diese Idee funktioniert?
[Es gibt ein ähnliches Problem in 'mtl' mit einer Reihe von Instanzen, die nur darauf brennen, zusammen gruppiert zu werden und _exactly_ den gleichen Code zu haben.] (Https://hackage.haskell.org/package/mtl-2.2 .1/docs/src/Control-Monad-State-Class.html # state) Wenn Edward Kmett keinen besseren Weg gefunden hat, dies zu tun, erwarte ich auch nicht, dass ... – Alec
Dies nicht die Adresse Hauptfrage, aber, warum Haskell Compiler nur zum Beispiel Auflösung an der Spitze sehen, Kmett Kommentare über die Open-World-Annahme und Compiler Fortschritt in https://www.reddit.com/r/haskell/comments/4mrgeb/how_do_you_avoid_repeating_mtlstyle_instances sehen/ – hao