Die & gt; & gt; Der Operator für Monads in Haskell wird oft als
definiert %Vor%Es kann verwendet werden, um Dinge wie
zu drucken %Vor% Warum optimiert der Compiler den Wert von putStr "foo"
nicht und bewertet nur putStrLn "bar"
? Es braucht es nicht, also warum es berechnen?
Wie Chris sagte, es hängt von der Monade ab. Identity
oder Reader
wertet den Teil vor >>
nicht aus, da sie ihn nicht zur Berechnung des Ergebnisses benötigen. Andere Monaden, wie Writer
, Maybe
, Either
, State
oder IO
werden.
Nehmen wir Maybe
als Beispiel. >>=
ist definiert als
Wenn wir also >>
erweitern, erhalten wir
So muss Maybe
auswerten, was vor >>
liegt, um zu sehen, ob das Ergebnis Nothing
oder y
ist.
IO
ist absichtlich so definiert, dass die Aktion ausgewertet wird, ob das Ergebnis benötigt wird oder nicht (sonst wäre es einfach unmöglich zu verwenden).
Huh? Natürlich braucht es den Wert von putStr "foo"
. Es wird in >>=
ausgewertet - nur das Ergebnis der Aktion wird verworfen, nicht die Aktion selbst, wenn Sie an Monaden als Aktionen denken möchten.
Zum Beispiel in einem Parser würde das bedeuten, die gerade analysierte Sequenz wegzuwerfen - aber sie wurde noch geparst, so dass der Cursor immer noch vorwärts bewegt wird.
Es hängt von der Monade ab. In IO wird ausgewertet. In Identität wird die erste nicht ausgewertet:
%Vor%Tags und Links haskell functional-programming monads operators