2017-11-13 2 views
0

wurde auf folgende Tutorial über Monaden und stecken lesen:Was bedeutet m >> = Rückkehr?

let m = return 2 :: IO Int 

, die verständlich ist - wir 2 in monadischen Variable (IO 2) packen Aber was bedeutet folgendes?

m >>= return 

Es gibt 2.

Wie ich aus Monad Definition wissen, dass Rückkehr immer genau ein Argument akzeptiert. Hier wird jedoch das Argument abgelehnt. Wie könnte es verstanden werden?

+4

'm >> = return' ist äquivalent zu' m'. –

+1

'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. –

Antwort

6

(>>=) 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 xx >>= 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.

+0

Wie könnte putStrLn IO zurückgeben, wenn es nur String akzeptiert und IO als Eingabeparameter nicht akzeptiert? (putStrLn :: String -> IO()) –

+1

@BulatM .: weil der '>> = Operator * den Wert im' IO' auspackt. Beachten Sie, dass es in der Typ-Signatur nicht "m a -> (m a -> m b) -> m b" ist, es ist "m a -> (a -> m b) -> m b". –

+0

Also IO zurückgegeben von "return" und IO zurückgegeben (zusätzlich zu String) von putStrLn sind zwei verschiedene Objekte? –