Depuis le Proposition de foncteur-applicatif-monade Dans la version 7.10 de GHC, Applicative est une superclasse de Monad. Donc, même si vos deux fonctions ne peuvent pas être strictement équivalentes, puisque sequenceA
Le domaine de l'UE comprend sequenceA'
nous pouvons observer ce qui se passe dans ce domaine commun (le Monad
typeclass).
Ce document montre une démonstration intéressante de désucrage do
aux opérations applicatives et fongicides ( <$>
, pure
y <*>
). Si les expressions situées à droite de vos flèches pointant vers la gauche ( <-
) ne dépendent pas les uns des autres, comme c'est le cas dans votre question, vous pouvez toujours utiliser des opérations applicatives, et donc montrer que votre hypothèse est correcte (pour l'élément Monad
domaine).
Jetez également un coup d'œil à la ApplicativeDo proposition d'extension de la langue, qui contient un exemple qui ressemble au vôtre :
do
x <- a
y <- b
return (f x y)
ce qui se traduit par :
(\x y -> f x y) <$> a <*> b
En substituant f
para (:)
on obtient :
do
x <- a
y <- b
return (x : y)
... ce qui se traduit par...
(\x y -> x : y) <$> a <*> b
--And by eta reduction
(:) <$> a <*> b
--Which is equivalent to the code in your question (albeit more general):
pure (:) <*> a <*> b
Alternativement, vous pouvez faire en sorte que le désucreur de GHC travaille pour vous en utilisant la fonction ApplicativeDo
extension de la langue et en suivant cette réponse à la question SO "haskell - Desugaring do-notation for Monads". Je vous laisse le soin de faire cet exercice (car il dépasse honnêtement mes capacités !).