2015-11-02 5 views
11

このプログラム考えてみましょう:ElmでDebug.logが逆の順序で印刷されるのはなぜですか?

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" 

それは、ブラウザのコンソールに以下をプリントアウト:

three: 3 
two: 2 
one: 1 

はなぜ順序が逆転しているの?実際

+2

let節は命令のリストではなく、一連の宣言であり、コンパイラは自由に "実行順序"を決定できます。一般に、機能的にプログラミングするときは、通常、実行順序を気にする必要はなく、概念とデータの関係に気を付ける必要があります。 – thSoft

答えて

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

は順序が反転しているように見える方法を

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"); 
}(); 

お知らせまでコンパイルされます。我々は結合せで何か他のものに依存している別の値を導入した場合、次のようではなく、たまたま:

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" 

が長いとそれの短いしたがって上がらない値が「ということです

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"); 
}(); 

に変身同じスコープ内の別の値に依存するtはボトムアップで処理されます。値が同じスコープ内の別の値に依存する場合、値は別々に処理され、一番下に置かれます。

これは実装の詳細です。

+4

"これはなぜ起こるのか"に対する優れた答えです。 「なぜ私は気にするべきですか」と答えるには:しないでください。それは不純な機能です。それは規則を破る。 – mgold

関連する問題