为什么Debug.log在Elm中以相反的顺序打印出来?

Mis*_*hko 13 elm

考虑这个程序:

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"
Run Code Online (Sandbox Code Playgroud)

它将以下内容打印到浏览器的控制台:

three: 3
two: 2
one: 1
Run Code Online (Sandbox Code Playgroud)

为什么订单被撤销了?

小智 30

main =
  let
    one = Debug.log "one" 1
    two = Debug.log "two" 2
    three = Debug.log "three" 3
  in
    show "Hello"
Run Code Online (Sandbox Code Playgroud)

实际上汇编到了

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");
}();
Run Code Online (Sandbox Code Playgroud)

注意订单似乎是如何翻转的.如果我们引入另一个依赖于let绑定中的其他值的值,则会发生以下情况:

 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"
Run Code Online (Sandbox Code Playgroud)

变成

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");
}();
Run Code Online (Sandbox Code Playgroud)

因此,它的长短是因为在同一范围内不依赖于另一个值的值从下到上进行处理.当值依赖于同一范围内的另一个值时,它将单独处理并放在底部.

这是一个实现细节.

  • "为什么会发生这种情况"的绝佳答案.回答"我为什么要关心":不要.这是一个不纯的功能; 它打破了规则. (4认同)