我注意到下面的代碼編譯和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