Die Anwendungsinstanz für MaybeT m geht von Monad m aus
Ich habe das benutztHaxl
Monade (hier beschrieben:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk), die das interessante Merkmal hat, dass<*>
für seine Applicative-Instanz ist nicht dasselbe wieap
von Control.Monad. Dies ist eine wichtige Funktion, die es ermöglicht, gleichzeitig Berechnungen durchzuführen, ohne zu blockieren. Zum Beispiel, wennhf
undha
sind dann lange Berechnungen
let hf :: Haxl (a -> b) = ...
ha :: Haxl a = ...
in do
f <- hf
a <- ha
return (f a)
wird sie nacheinander tun, während
hf <*> ha
werden sie parallel machen und dann die Ergebnisse kombinieren.
Ich möchte in der Lage sein, Berechnungen durchzuführenMaybeT Haxl
, aber das Problem ist, dass die Anwendungsinstanz fürMaybeT m
Im Transformers-Paket wird monadic bind verwendet:
instance (Functor m, Monad m) => Applicative (MaybeT m) where
pure = return
(<*>) = ap
Woap = liftM2 id
ausControl.Monad
. Das macht
let hmf :: MaybeT Haxl (a -> b) = ...
hma :: MaybeT Haxl a = ...
in hmf <*> hma
laufen nacheinander. Es scheint, als wäre eine bessere Instanz eine bessere
instance (Applicative m) => Applicative (MaybeT m) where
pure = MaybeT . pure . Just
MaybeT f <*> MaybeT x = MaybeT $ (<*>) <instance (Applicative m) => Applicative (MaybeT m) where
pure = MaybeT . pure . Just
MaybeT f <*> MaybeT x = MaybeT $ (<*>) <$> f <*> x
gt; f <*> x
(Hier,(<*>)
auf der rechten Seite ist für dieMaybe
Monade, während die nicht in Klammern<*>
auf der rechten Seite ist fürm
.) Beachten Sie, dass der Kontext anders ist - die obige Instanz geht nur davon ausApplicative m
, während die Instanz in Transformern annimmtFunctor m, Monad m
.
Meine Hauptfrage ist praktisch: Was soll ich dagegen tun? Soll ich meine eigenen rollen?MaybeT
Monadentransformator? Gibt es eine Möglichkeit, um die Beschwerde "Doppelte Instanzdeklarationen" zu umgehen, die ghc mir gibt, wenn ich versuche, das oben Gesagte zu schreiben?
Ich würde auch gerne wissen: Ist das aktuelle Setup ein Designfehler im Transformers-Paket? Wenn nein, warum nicht?