Kann es einen mtl-ähnlichen Mechanismus für Monadetransformatoren geben, die von FreeT/ProgramT erstellt wurden?Monad Stack Penetration Klassen mit Free/Operational Monad Transformers?
Mein Verständnis der Geschichte ist wie folgt. Es war einmal Monad Transformator wurde erfunden. Dann begannen die Leute, die Monade-Transformatoren aufeinander zu stapeln, und es war dann lästig, überall die lift
einzufügen. Dann haben ein paar Leute Monad Klassen erfunden, so dass wir z. ask :: m r
in einer beliebigen Monade m
so, dass MonadReader r m
. Dies war möglich durch jede Monade Klasse macht eindringen jeden Monade Transformators, wie
(Monoid w, MonadState s m) => MonadState s (WriterT w m)
MonadWriter w m => MonadWriter w (StateT s m)
Sie solches Paar von Instanzdeklarationen müssen für jedes Paar von Monade Transformatoren, so, wenn es n Monade Transformatoren gibt es n^2 Kosten. Dies war jedoch kein großes Problem, da die Leute vordefinierte Monaden verwenden und nur selten eigene erstellen. Die Geschichte soweit ich verstehe, und ist auch ausführlich z. in dem folgenden Q & A:
Avoiding lift with Monad Transformers
Dann ist mein Problem mit den neuen Freien Monaden http://hackage.haskell.org/package/free und Operational Monaden http://hackage.haskell.org/package/operational. Sie erlauben uns, unser eigenes DSL zu schreiben und es als Monaden zu benutzen, indem wir einfach die Sprache als algebraischen data
Typ definieren (Operational braucht nicht einmal Functor
Instanzen). Eine gute Nachricht ist, dass wir Monaden und Monade-Transformatoren kostenlos haben können; Wie wäre es dann mit Monad-Klassen? Schlechte Nachrichten sind, dass die Annahme "wir definieren selten unsere eigenen Monadetransformatoren" nicht mehr gilt.
Als Versuch, dieses Problem zu verstehen, machte ich zwei ProgramT
s und ließ sie einander durchdringen;
https://github.com/nushio3/practice/blob/master/operational/exe-src/test-05.hs
Die operational
Paket unterstützen Klassen Monade nicht so nahm ich eine weitere Implementierung minioperational
und modifiziert es zu arbeiten, wie ich brauche; https://github.com/nushio3/minioperational
Trotzdem brauchte ich die spezielle Instanz Erklärung
instance (Monad m, Operational ILang m) => Operational ILang (ProgramT SLang m) where
weil die allgemeine Erklärung der folgenden Form führt zu unentscheidbar Instanzen.
instance (Monad m, Operational f m) => Operational f (ProgramT g m) where
Meine Frage ist, wie können wir es leichter, lassen Sie unsere Operational Monaden durchdringen einander machen. Oder, ist mein Wunsch, Penetration für jede operierende Monade zu bekommen, die schlecht gestellt ist.
Ich würde auch die korrekte Fachbegriff für Penetration gerne wissen :)
Danke, Petr. Mit Ihrer Hilfe habe ich verstanden, wie man zwei Typkonstruktoren mit Hilfe von »(* -> *)« kombiniert. https://github.com/nushio3/practice/blob/master/operational/exe-src/test-06.hs Composable Dolmetscher schreiben sind genauso einfach: https://github.com/nushio3/practice/ Blob/Master/Betrieb/exe-src/test-07.hs Wir können sogar auf Kosten des 'OverlappingInstances' mehr als zwei Sprachen zusammensetzen. https://github.com/nushio3/practice/blob/master/operational/exe-src/test-08.hs – nushio