Warum bewertet harkell a in a b?

7

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?

    
Erik Henriksson 15.12.2012, 12:51
quelle

3 Antworten

10

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

%Vor%

Wenn wir also >> erweitern, erhalten wir

%Vor%

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).

    
Petr Pudlák 15.12.2012, 21:10
quelle
6

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.

    
Cubic 15.12.2012 12:55
quelle
6

Es hängt von der Monade ab. In IO wird ausgewertet. In Identität wird die erste nicht ausgewertet:

%Vor%     
Chris Kuklewicz 15.12.2012 13:17
quelle