(>>=)
ist der Operator bind. Es hat Unterschrift:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
So erwartet sie (auf der linken Seite), um ein einstelliges Objekt (zum Beispiel IO Int
) und auf der rechten Seite eine Funktion a -> m b
(zum Beispiel Int -> IO b
) hier.
Der Operator wird verwendet, um Operationen in einer Monade miteinander zu verketten. Zum Beispiel putStrLn :: String -> IO()
kann verwendet werden, wenn wir es wie verwenden:
return "foo" >>= putStrLn
So, jetzt wir return
ein String "foo"
. Der Bindeoperator wird es sozusagen aus der IO-Monade auspacken und es an die -Funktion übergeben, die "foo"
an den Standard-Ausgabekanal druckt und eine IO()
zurückgibt. Wir können dann das IO()
für die weitere Verarbeitung verwenden.
Seit return
Wraps Daten in eine Monade, Schreiben >>= return
ist im Grunde nutzlos. Da für alle x
x >>= return
sollte gleich x
sein. Das Argument return
fehlt nicht in dem Sinne, dass >>=
die Rückgabe mit einem Argument aufrufen wird. Sie können auch schreiben:
m >>= (\x -> return x)
aber dies ist äquivalent zu m >>= return
.
'm >> = return' ist äquivalent zu' m'. –
'return' und' (\ x -> return x) 'sind gleich. 'm >> = (\ x -> return x)' ist das gleiche wie 'do {x <- m; return x} '. Aufgrund der Monadengesetze ist es auch das gleiche wie 'do {m}' oder einfach 'm'. Es ist auch das gleiche wie 'do {x <- m; y <- zurück x; Rückkehr y} ', wegen des gleichen Monad-Gesetzes. –