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).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage