我注意到下面的代码编译和VS 2013的工作原理:为什么在功能内允许“做”?
let f() =
do Console.WriteLine(41)
42
但看F#3.0规范时,我找不到任何do
提及使用这种方式。据我所知,do
可以有以下用途:
- 作为环的一部分(例如
while expr do expr done
),这是不是这里的情况。 内部计算表达式,例如:
seq { for i in 1..2 do do Console.WriteLine(i) yield i * 2 }
,这里不是这种情况要么,
f
不含任何计算表达式。虽然这里让我困惑的是,根据规范,
do
应该跟着in
。由于轻量级语法,in
应该是可选的,但在此处添加它会导致编译错误(“未预期的令牌”或“不完整的表达式”)。声明在模块或类中。这里也不是这种情况,
do
位于函数内部,不在模块或类中。
我也注意到,与#light "off"
,代码不编译(“意外的关键字结合‘做’”),但我没有发现任何会在轻量级语法部分要么解释。
基于这一切,我假设在函数内部使用do
这种方式不应该编译,但它确实如此。我错过了规范中的一些东西吗?或者这实际上是编译器或规范中的错误?
它被称为'do'绑定。我在规范中找不到它,但它[在MSDN上记录](http://msdn.microsoft.com/en-us/library/dd393786.aspx)。 – Daniel
@Daniel这是我提到的第三种情况,在模块内部做“ “当你想要独立于函数执行代码*时使用do绑定*” – svick
完成引用:_独立于函数*或值定义* ._第二种情况可能适用于函数。 – Daniel