F#令人困惑的输出

kr8*_*r85 4 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()
Run Code Online (Sandbox Code Playgroud)

我期望文本输出将按以下顺序排列:

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

或这个

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

但我得到了这个

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

似乎这些函数不符合代码执行顺序.为什么,我错过了什么?

sep*_*p2k 8

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

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

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

    5.1.内部变量msg设置为"非常重要".让我们把它称为innerMsg消除歧视.

    5.2.innerMsg打印出来.

  6. msg(它仍然具有"重要"的值,因为它完全不相关innerMsg)再次打印.