Il y a beaucoup à dire en réponse à votre question, cependant, puisque vous le demandez, je vais proposer cette "règle du pouce."
Si vous utilisez do
-notation et de vos valeurs générées[1] ne sont pas utilisés dans les expressions que vous êtes séquençage[1], alors que le code peut se transformer en un Applicatif de style. De même, si vous utilisez une ou plusieurs des valeurs générées dans une expression qui est séquencé, alors vous devez utiliser Monad
et Applicative
n'est pas assez forte pour atteindre le même code.
Par exemple, regardons le code suivant:
do a <- e1
b <- e2
c <- e3
return (f a b c)
Nous voyons que, dans aucune des expressions à droite de l' <-
effectuez l'une des valeurs générées (a
, b
, c
) apparaissent. Par conséquent, nous pouvons le transformer à l'aide de code Applicatif. Voici l'une des transformations possibles:
f <$> e1 <*> e2 <*> e3
et un autre:
liftA3 f e1 e2 e3
Sur l'autre main, prenez ce morceau de code par exemple:
do a <- e1
b <- e2 a
c <- e3
return (f b c)
Ce code ne peut pas utiliser Applicative
[3] en raison de la valeur générée a
est utilisé plus tard dans une expression dans la compréhension. Ce doit utiliser Monad
pour arriver à son résultat -- tenter d'en tenir compte dans Applicative
pour avoir une idée de pourquoi.
Il y a quelques intéressant et utile de détails à ce sujet, cependant, je viens de vous donner, cette règle générale en vertu de laquelle vous pouvez évoquer do
-de la compréhension et de déterminer assez rapidement si elle peut être prise en compte dans Applicative
code de style.
[1] Ceux qui apparaissent à gauche de l' <-
.
[2] les Expressions qui apparaissent à droite de l' <-
.
[3] à proprement parler, certaines parties pourraient, en donnant la e2 a
.