F#令人困惑的输出

时间:2011-09-02 20:06:48

标签: f#

我是F#初学者。我运行了这段代码:

let printMsg() =
    let msg = "Important"
    printfn "%s" msg
    let innerMsgChange() =
        let msg = "Very Important"
        printfn "%s" msg
    printfn "%s" msg
    innerMsgChange()
    printfn "%s" msg

printMsg()

我希望文本输出符合以下顺序:

  

重要,非常重要,重要,重要

或者

  

重要,非常重要,非常重要,重要

但我得到了这个

  

重要,重要,非常重要,重要

似乎这些功能不符合代码执行顺序。为什么,我错过了什么?

2 个答案:

答案 0 :(得分:8)

首先,重要的是指出innerMsgChange没有做它的名字所承诺的:它创建一个名为msg的新变量(它与外部变量完全无关,也被称为{ {1}})使用值“非常重要”然后打印它。所以本质上它打印字符串“非常重要”,就是这样。

那么执行代码的顺序是什么?简单:

  1. 变量msg设置为“重要”
  2. 打印出该变量。
  3. msg函数已定义,但未调用(这不是实际执行的步骤,因此基本上没有任何事情发生在此行上)
  4. 再次打印变量innerMsgChange
  5. msg被称为

    5.1。内部变量innerMsgChange()设置为“非常重要”。我们将其称为msg来解除歧视。

    5.2。 <{1}}已打印。

  6. innerMsg(仍然具有“重要”值,因为它与innerMsg完全无关)会再次打印。

答案 1 :(得分:1)

输出符合预期

1)重要 - &gt; printfn“%s”msg(第3行)

然后你定义函数,而不是调用它。

2)重要 - &gt; printfn“%s”msg(第7行)

现在,你打电话给它。

3)非常重要 - &gt; printfn“%s”msg(函数innerMsgChange内的第6行)

4)重要 - &gt; printfn“%s”msg(第9行)