Ich habe Schwierigkeiten zu verstehen, wie eine Funktion eine Monade sein kann.Funktion als eine Instanz von Monad
Funktion (->) r
ist eine Monade nach einer Erklärung in Control.Monad.Instances
:
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
Auch was Miran Lipovača says darüber macht mich verwirrt:
Die Implementierung für
>>=
ein wenig kryptisch scheint, aber es ist wirklich nicht all das. Wenn wir>>=
verwenden, um einer Funktion einen monadischen Wert zuzuweisen, ist das Ergebnis immer ein monadischer Wert. Wenn wir in diesem Fall eine Funktion einer anderen Funktion zuführen, ist das Ergebnis ebenfalls eine Funktion. Das ist warum das Ergebnis als Lambda beginnt. Alle Implementierungen von isolierten das Ergebnis immer irgendwie vom monadischen Wert und fügten dann die Funktion f zu diesem Ergebnis hinzu. Das gleiche passiert hier . Um das Ergebnis einer Funktion zu erhalten, müssen wir es auf etwas anwenden, weshalb wir(h w)
hier tun, um das Ergebnis von der Funktion zu bekommen, und dann wenden wir f an. f gibt einen monadischen Wert zurück, der ist eine Funktion in unserem Fall, also wenden wir ihn auch auf w an.
Die Art Unterschrift (>> =) ist dies: (>> =) :: ma -> (a -> mb) -> mb
Also nehme ich, dass h
wie typisiert m a
und f
als (a -> m b)
. Wenn eine Funktion m a
ist, gibt sie einen Wert a
zurück? oder gibt es etwas anderes zurück, das einen a
Typ nimmt?
Wenn der nicht-Monade Wert von h
-f
zugeführt wird, dann erhalten wir: f (h w) sieht gut aus. Da f
eine Funktion ist und ihr einziges Argument genommen hat, ist es schon ein Wert, nein? Da es sich um eine monadische Funktion handelt, ist der Wert auch ein monadischer Wert. Warum benötigt es dann einen anderen Wert w
? Füttert w
nicht zu f something
macht es nicht-monadisch, d. H. Es ist keine Funktion mehr, nein? Ich kann auch nicht verstehen, warum f something
und h
das gleiche Argument w
nehmen und verschiedene Werttypen (m a
und m b
) zurückgeben.
Danke. Alles ist klar! – amemus