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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage