Monad mächtiger als Applicative?
Ich sah vergangene Diskussion konnte aber nicht erkennen, warum eine der Antworten tatsächlich richtig ist.
Applicative
<*> :: f (a -> b) -> f a -> f b
Monad
(>>=) :: m a -> (a -> m b) -> m b
So wenn ich es richtig verstehe, ist die Behauptung, dass>>=
kann nicht nur unter der Annahme der Existenz von @ geschrieben werd<*>
Nun, nehmen wir an, ich habe<*>
.
Und ich möchte @ erstell>>=
.
Also habe ichf a
.
Ich habef (a -> b)
.
Nun wenn du es dir anschaust,f (a -> b)
kann als @ geschrieben werd(a -> b)
(wenn etwas eine Funktion von x, y, z ist - dann ist es auch eine Funktion von x, y).
So aus der Existenz von<*>
wir bekommen(a -> b) -> f a -> f b
was wiederum als @ geschrieben werden ka((a -> b) -> f a) -> f b
, das als @ geschrieben werden ka(a -> f b)
.
Also haben wirf a
, wir haben(a -> f b)
, und wir wissen, dass<*>
ergibtf b
, so bekommen wir:
f a -> (a -> f b) -> f b
Das ist eine Monade.
Eigentlich in einer intuitiveren Sprache: bei der Implementierung von<*>
, Extrahiere ich(a -> b)
ausf(a -> b)
, Extrahiere icha
ausf a
, und dann bewerbe ich mich(a -> b)
aufa
und bekommeb
was ich einpacke mitf
um endlich @ zu bekommf b
.
So mache ich fast das gleiche, um @ zu erstell>>=
. Nach der Bewerbung(a -> b)
aufa
und immerb
, mach noch einen Schritt und umhülle ihn mitf
, also kehre ich zurückf b
, daher weiß ich, dass ich eine Funktion habe(a -> f b)
.