Hay mucho que decir en respuesta a su pregunta, sin embargo, ya que ha preguntado, ofreceré esta "regla práctica".
Si está utilizando do
-notación y sus valores generados [1] no se utilizan en las expresiones que está secuenciando [2], entonces ese código puede transformarse a un estilo Aplicativo. De manera similar, si usa uno o más de los valores generados en una expresión que está secuenciada, entonces debe usar Monad
y Applicative
no es lo suficientemente fuerte para lograr el mismo código.
Por ejemplo, veamos el siguiente código:
do a <- e1
b <- e2
c <- e3
return (f a b c)
vemos que en ninguna de las expresiones a la derecha de <-
hacer cualquiera de los valores generados (a
, b
, c
) aparecen. Por lo tanto, podemos transformarlo utilizando el código Aplicativo.He aquí una posible transformación:
f <$> e1 <*> e2 <*> e3
y otro:
liftA3 f e1 e2 e3
Por otro lado, tomar esta pieza de código, por ejemplo:
do a <- e1
b <- e2 a
c <- e3
return (f b c)
Este código no se puede utilizar Applicative
[3 ] porque el valor generado a
se usa más adelante en una expresión en la comprensión. Esto debe usar Monad
para obtener su resultado: intente factorizarlo en Applicative
para tener una idea de por qué.
Hay algunos detalles más interesantes y útiles sobre este tema, sin embargo, sólo destinados a dar a esta regla general mediante el cual puede deslizarse sobre una -comprehension do
y determinar con bastante rapidez si puede ser un factor en Applicative
código de estilo .
[1] Los que aparecen a la izquierda de <-
.
[2] Expresiones que aparecen a la derecha de <-
.
[3] en sentido estricto, algunas partes de él podrían, por factorizar e2 a
.
Ese es el único lugar que he visto donde se explica la diferencia entre 'Monad' y' Applicative' (en términos de lo que puedes expresar con cada uno). ¡Gran trabajo! ¿Podemos llamar 'ifte' con las funciones de aplicación:' z = ifte <$> ... '? –
'ifte' ya es una función monádica, por lo que no hay mucho más que levantarlo una vez más. –
Puede escribir "ifte" <$> (True puro) "como" ifte "Verdadero" - "puro" rara vez es necesario en combinación con "<$>" y "<*>" (si lo tiene). – Martijn