2013-04-10 34 views
1

我已經開始使用F#並且一些代碼結構讓我困惑。例如:F#,賦值操作符vs集合運算符

我有下面的代碼:

let mutable s = 10 
s <- 1 + s 
printf "%i" s 

一切都是從數學方面明確。我將「s」標記爲可變,並將新值賦給「s」。結果是11

讓我試試其它代碼的一部分:

let mutable s = 10 
s = 1 + s 
printf "%i" s 

此代碼是工作。但是我發現s = 1 + s在數學方面有點奇怪。執行這個的結果是10.

我的問題,最後一個樣本是怎麼回事?爲什麼我沒有收到錯誤? s = 1 + s剛被忽略?爲什麼?我沒有在輸出中得到任何錯誤。

回答

3

要回答你的第二個問題 -

爲什麼我沒有得到一個錯誤? s = 1 + s是否被忽略?爲什麼?我沒有在輸出中得到任何錯誤。

原因是F#區分腳本文件中的頂級範圍和本地範圍。當你在一個腳本文件中(*.fsx文件在Visual Studio或Try F#中),那麼你可能想編寫一個表達式序列(它可能會返回一個值)並逐個交互地執行它們。這意味着當你在一行上寫s = 1 + s時,這不是一個錯誤,因爲你可以評估該行(選中它並按Ctrl + Enter或Alt + Enter)並在交互式輸出中查看結果。

但是,當它出現在函數內部(或者在其他本地範圍中,您不需要交互式地評估它)時,您會收到警告。最簡單的方法是使用do創建本地示波器(並且這也適用於Try F#):

do 
    let mutable s = 10 
    s = 1 + s   // Warning: This expression should have type 'unit', 
         // but has type 'bool'. If assigning to a property 
         // use the syntax 'obj.Prop <- expr'. 
    printf "%i" s 
4

代碼

s=1+s 

意願不修改s - 相當於C#是

s==1+s 

剛剛返回false

事實上,編譯器應該發出一個警告關於一個未被使用的值。

=運算符只是執行相等性檢查 - 它確實不是分配任何值。

+0

你說得對。我的錯誤是,我試圖在下一個方法「printf」%b「s = 1 + s」的結果。它被撞毀了。當我以下面的方式修改我的代碼「printf」%b「(s = 1 + s)」。它工作正確,並返回「假」(如預期) – RredCat 2013-04-10 11:34:01

+0

此外,我使用http://www.tryfsharp.org - 所以有可能我有限的輸出。 – RredCat 2013-04-10 11:36:15

+1

@RredCat我也沒有在'fsi'中得到任何警告 - 它們只在使用完整編譯器時出現 – 2013-04-10 12:35:12