Mónada más potente que aplicativo?
Mirédiscusión pasada pero no podía ver por qué ninguna de las respuestas es correcta.
Aplicativo
<*> :: f (a -> b) -> f a -> f b
Monada
(>>=) :: m a -> (a -> m b) -> m b
Entonces, si lo hago bien, la afirmación es que>>=
no se puede escribir solo asumiendo la existencia de<*>
Bueno, supongamos que tengo<*>
.
Y quiero crear>>=
.
Así que tengof a
.
yo tengof (a -> b)
.
Ahora cuando lo miras,f (a -> b)
Se puede escribir como(a -> b)
(si algo es una función de x, y, z, entonces también es una función de x, y).
Entonces de la existencia de<*>
obtenemos(a -> b) -> f a -> f b
que de nuevo se puede escribir como((a -> b) -> f a) -> f b
, que se puede escribir como(a -> f b)
.
Entonces tenemosf a
, tenemos(a -> f b)
y sabemos que<*>
resultados enf b
, entonces obtenemos:
f a -> (a -> f b) -> f b
que es una mónada
En realidad, en un lenguaje más intuitivo: al implementar<*>
, Extraigo(a -> b)
fuera def(a -> b)
, Extraigoa
fuera def a
y luego aplico(a -> b)
ena
y obtenb
que envuelvo conf
para finalmente obtenerf b
.
Entonces hago casi lo mismo para crear>>=
. Después de aplicar(a -> b)
ena
y conseguirb
, da un paso más y envuélvelo conf
entonces regresof b
, por lo tanto sé que tengo una función(a -> f b)
.