Warum ist das nicht faul?

8

Ich fange immer noch an, Haskell zu erforschen. Ich weiß, dass dieser Code in der IO -Monade "läuft". Wenn es von der l <- ... -Zeile zur nächsten geht, wird IO - bind aufgerufen.

Man könnte meinen, dass, weil Haskell faul ist, das l niemals ausgewertet wird. Aber " bind " wertet immer den vorherigen Befehl aus, ist das richtig? Weil das Programm den Fehler "Datei nicht gefunden" erzeugt.

%Vor%     
Cartesius00 01.12.2012, 20:28
quelle

2 Antworten

15
  

Man könnte denken, dass, weil Haskell faul ist, das l niemals ausgewertet wird.

Ja, und es wird nie ausgewertet. Aufgrund der Definition von (>>=) in IO wird jedoch die Aktion readFile "/tmp/notfound" ausgeführt, was bedeutet, dass die Laufzeit versucht, die Datei zu öffnen. Wenn es keine solche Datei gibt, wird der Fehler "Datei nicht gefunden" angezeigt. Wenn es eine solche Datei gäbe, würde sie geöffnet werden, aber ihr Inhalt würde nicht gelesen werden, bis sie angefordert wird. Im obigen werden sie nicht verlangt, deshalb wird der Inhalt nicht gelesen.

Was hier bewertet (und sogar ausgeführt) wird, ist die Aktion, die l erzeugt. Da die Datei nicht existiert, löst dies einen Fehler aus.

    
Daniel Fischer 01.12.2012, 20:40
quelle
9

Wenn Sie die do Notation in Ihrem Code erweitern, erhalten Sie:

%Vor%

Also ja, l wird nie ausgewertet, aber das bedeutet nicht, dass der Aufruf von mapM niemals ausgewertet wird. >>= muss immer seinen linken Operanden auswerten, um einen Wert zumindest bis zu einem gewissen Grad zu erzeugen (zumindest in der IO-Monade und in jeder anderen Monade, die mir in den Sinn kommt).

    
sepp2k 01.12.2012 20:42
quelle

Tags und Links