关于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不是函数,而是单个值.编译器确保值按照在源文件中声明的顺序初始化,因此这里发生的是:
ExeC 初始化ExeA 初始化Example 1使用ExeA初始值打印ExeB函数被称为正常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)
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |