Sagen wir, ich habe folgendes amazin Stück Code geschrieben:„<-“ und die damit verbundenen Werte
func = do
a <- Just 5
return a
Es ist ziemlich sinnlos, ich weiß. Hier ist a
5
, und func
gibt Just 5
zurück.
Jetzt habe ich meine ehrfürchtige (noch sinnlos) Funktion umschreiben:
func' = do
a <- Nothing
return a
Diese Funktion gibt Nothing
, aber was zum Teufel ist a
? Es gibt nichts, von einem Nothing
Wert zu extrahieren, doch das Programm jammert nicht, wenn ich so etwas tun:
func'' = do
a <- Nothing
b <- Just 5
return $ a+b
Ich habe gerade eine harte Zeit zu sehen, was tatsächlich passiert. Was ist a
? Mit anderen Worten: Was macht <-
eigentlich? Wenn man sagt "extrahiert den Wert von der rechten Seite und bindet ihn an die linke Seite", vereinfacht dies offensichtlich die Vereinfachung. Was bekomme ich nicht?
Thanks :)
'<-' wird in' >> = 'übersetzt. Im Fall von "Maybe" Monade, wenn das erste Argument (d. H. Der Teil rechts zu "<-')" Nichts "ist, wird nichts anderes ausgewertet und' >> = 'gibt nur' Nothing' zurück. Also, um Ihre Frage zu beantworten: Die Ausführung ist nicht einmal _reach_ 'a'. – Vitus
Wenn Sie an Monaden als Container denken, können Sie mit der Do-Notation die Werte (falls vorhanden) in den Monaden zuweisen und dann Funktionen definieren, die auf diese Werte angewendet werden. Aber die Extraktion ist eine Illusion - Funktionen werden innerhalb der Monade angewendet (mit '>> ='), weil es keine allgemeine Möglichkeit gibt, einen Wert aus einer Monade zu extrahieren. Beachten Sie, wie Sie jeden do-Block beenden, indem Sie result _back in die monad_ setzen, oft mit return. Du hattest nie wirklich eine Variable "a", die gleich 5 war. – Nefrubyr