在使用 F# 团队博客文章测试 F# 尾调用时,我发现几乎相同的代码具有相同的结果,但IL不同,尽管代码中只有括号不同。
下一个代码由编译器优化,我br.s IL_0000
在 IL 末尾看到并且没有调用sumSoFar
let rec loopAndSum aList sumSoFar =
match aList with
| [] -> sumSoFar
| x :: xs ->
loopAndSum xs (sumSoFar + x)
loopAndSum [ 1..5 ] 0
|> printfn "sum: %i"
但是那部分没有被编译器优化,它已经call bla_bla.loopAndSum
接近 IL 的结尾。
let rec loopAndSum aList sumSoFar =
match aList with
| [] -> sumSoFar
| x :: xs ->
loopAndSum xs sumSoFar + x
loopAndSum [ 1..5 ] 0
|> printfn "sum: %i"
这些示例的不同之处仅在于 . 周围的括号sumSoFar + x
。您可以使用它并在.NET Fiddle上查看 IL 。
有人知道为什么括号很重要吗?