2015-11-02 5 views
11

dieses Programm vor:Warum Debug.log in umgekehrter Reihenfolge in Elm ausgedruckt?

import Graphics.Element exposing (..) 
import Debug 


main : Element 
main = 
    let 
    one = Debug.log "one" 1 
    two = Debug.log "two" 2 
    three = Debug.log "three" 3 
    in 
    show "Hello" 

Es druckt die folgenden Browser-Konsole aus:

three: 3 
two: 2 
one: 1 

Warum ist die Reihenfolge umgekehrt?

+2

Eine let-Klausel ist keine Liste von Anweisungen, sondern eine Menge von Deklarationen. Der Compiler kann seine "Ausführungsreihenfolge" bestimmen. Im Allgemeinen müssen Sie sich bei der funktionalen Programmierung normalerweise nicht mit der Ausführungsreihenfolge auseinandersetzen, sondern mit der Beziehung zwischen Konzepten und Daten. – thSoft

Antwort

27
main = 
    let 
    one = Debug.log "one" 1 
    two = Debug.log "two" 2 
    three = Debug.log "three" 3 
    in 
    show "Hello" 

Eigentlich kompiliert wird bis auf

var main = function() { 
    var three = A2($Debug.log, 
    "three", 
    3); 
    var two = A2($Debug.log, 
    "two", 
    2); 
    var one = A2($Debug.log, 
    "one", 
    1); 
    return $Graphics$Element.show("Hello"); 
}(); 

Beachten Sie, wie die Reihenfolge umgedreht zu sein scheint. Wenn wir einen anderen Wert einführen, die auf etwas anderes in der wir verbindlich abhängig ist, geschieht folgendes statt:

main = 
    let 
    one = Debug.log "one" 1 
    two = Debug.log "two" 2 
    three = Debug.log "three" 3 
    four = Debug.log "four" three + one 
    in 
    show "Hello" 

verwandelt sich in

var main = function() { 
    var three = A2($Debug.log, 
    "three", 
    3); 
    var two = A2($Debug.log, 
    "two", 
    2); 
    var one = A2($Debug.log, 
    "one", 
    1); 
    var four = A2($Debug.log, 
    "four", 
    three) + one; 
    return $Graphics$Element.show("Hello"); 
}(); 

Die lange Rede kurzer Sinn ist daher, dass die Werte, die ‚aren t abhängig von einem anderen Wert im selben Umfang wird von unten nach oben verarbeitet. Wenn ein Wert auf einen anderen Wert innerhalb desselben Bereichs angewiesen ist, wird er separat behandelt und an den unteren Rand gesetzt.

Dies ist ein Implementierungsdetail.

+4

Eine ausgezeichnete Antwort für "warum passiert das". Um zu antworten "warum sollte ich mich interessieren": nicht. Es ist eine unreine Funktion; Es bricht die Regeln. – mgold