2011-06-30 70 views
3

我想指出一個F#中的'風險'部分。請看下面的代碼使用F#可變值的模式匹配

let mutable a, b as ab = 0, 0 
a <- 4 
a 
ab 

你會得到a = 4ab = 0, 0。這可能是一個正確的行爲,我只是想指出並瞭解你的意見。你覺得這種行爲是否合乎邏輯,爲什麼?我有一些問題需要接受,因爲我一直認爲(a,b)和ab應該是相同的。

回答

5

如果你在F#交互運行let mutable a, b as ab = 0, 0您將獲得:

val mutable ab : int * int = (0, 0) 
val mutable b : int = 0 
val mutable a : int = 0 

這意味着表達創造了3個不同的和獨立的價值觀。修改一個值不會影響其他值

4

確實,這可能會讓您感到困惑,但一旦您瞭解F#如何處理聲明(如Ankur所解釋的),應該很有道理。

你可以得到其他行爲(如修改一個值也修改一個元組),如果你使用的參考單元,而不是mutable變量:

let a, b as ab = ref 0, ref 0 
a := 4 
!(fst ab) // returns 4