Mônada mais poderosa que Aplicativa?
Eu olheidiscussão anterior mas não conseguia entender por que algumas das respostas estão realmente corretas.
Aplicável
<*> :: f (a -> b) -> f a -> f b
Mônada
(>>=) :: m a -> (a -> m b) -> m b
Então, se eu acertar, a alegação é que>>=
não pode ser escrito assumindo apenas a existência de<*>
Bem, vamos supor que eu tenho<*>
.
E eu quero criar>>=
.
Então eu tenhof a
.
eu tenhof (a -> b)
.
Agora, quando você olha para isso,f (a -> b)
pode ser escrito como(a -> b)
(se algo é uma função de x, y, z - também é uma função de x, y).
Então, a partir da existência de<*>
Nós temos(a -> b) -> f a -> f b
que novamente pode ser escrito como((a -> b) -> f a) -> f b
, que pode ser escrito como(a -> f b)
.
Então nós temosf a
, temos(a -> f b)
e sabemos que<*>
resulta emf b
, então obtemos:
f a -> (a -> f b) -> f b
que é uma mônada.
Na verdade, em uma linguagem mais intuitiva: ao implementar<*>
Eu extraio(a -> b)
fora def(a -> b)
Eu extraioa
fora def a
e depois aplico(a -> b)
ema
e pegueb
que envolvo comf
finalmente conseguirf b
.
Então eu faço quase o mesmo para criar>>=
. Depois de aplicar(a -> b)
ema
e recebendob
, execute mais uma etapa e envolva-a comf
então eu voltof b
, portanto, eu sei que tenho uma função(a -> f b)
.