J'ai rencontré plusieurs situations où je voudrais utiliser le style applicatif f <$> x1 <*> x2 <*> x3
mais en balayant les arguments applicatifs de droite à gauche au lieu des habituels de gauche à droite.Arguments de balayage applicables de droite à gauche
Naturellement, si je soulève cette question dans un contexte monadique, je peux le faire sans problème:
liftM3' :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3' f x1 x2 x3 = do { x3' <- x3; x2' <- x2; x1' <- x1; return f x1' x2' x3' }
Alors, ma question: est-il une méthode générale pour accomplir cela dans le contexte de seulement Applicative
(peut-être un wrapper newtype) et si non, pourquoi ne peut-il pas y en avoir un. Cela dit, tout aperçu des solutions élégantes ou des solutions de contournement à ce problème sont les bienvenus.
A côté: Ma solution avait été de définir de nouveaux opérateurs associatifs droits, mais la solution n'était en aucun cas élégante.
Modifier: Voici ma solution (je serais intéressé à savoir s'il y a quelque chose d'équivalent dans les bibliothèques standard), si je requiers Monad
:
newtype Reverse m a = Reverse (m a)
instance Monad m => Functor (Reverse m) where
f `fmap` x = pure f <*> x
instance Monad m => Applicative (Reverse m) where
pure x = Reverse $ return x
(Reverse f) <*> (Reverse x) = Reverse $ do { x' <- x; f' <- f; return $ f' x' }
La proposition ['ApplicativeDo'] (https://ghc.haskell.org/trac/ghc/wiki/ApplicativeDo) pourrait vous intéresser. – chepner