F#代码执行顺序

Mar*_*arl 9 f#

关于F#的另一个noob问题.

如果我有以下代码......

let ExeC =
    printfn "c"
    3

let ExeB b = 
    printfn "b"
    2

let ExeA = 
    printfn "a"
    1

printfn "Example %d " ExeA
printfn "Example %d " (ExeB 1)
printfn "Example %d " ExeC
Run Code Online (Sandbox Code Playgroud)

输出如下......

c
a
Example 1
b
Example 2
Example 3
Run Code Online (Sandbox Code Playgroud)

这里似乎不寻常的是代码执行的顺序.在上一个问题中,Brian提到了一些关于表达式的问题,我希望有人可以解释一下这个问题.几乎看起来编译器是智能地预先执行事物来计算值...但我不知道?

Tim*_*son 14

ExeA并且ExeC不是函数,而是单个值.编译器确保值按照在源文件中声明的顺序初始化,因此这里发生的是:

  1. ExeC 初始化
  2. ExeA 初始化
  3. Example 1使用ExeA初始值打印
  4. ExeB函数被称为正常
  5. Example 3使用ExeC初始值打印

如果你想要ExeA并且ExeC真正懒惰 - 也就是控制他们的副作用何时运行 - 你可以将它们变成接受的函数unit:

let ExeC () =
    printfn "c"
    3

let ExeB b = 
    printfn "b"
    2

let ExeA () = 
    printfn "a"
    1

printfn "Example %d " (ExeA ())
printfn "Example %d " (ExeB 1)
printfn "Example %d " (ExeC ())
Run Code Online (Sandbox Code Playgroud)