2013-04-21 70 views

回答

5

這不是一個可變值。但是你使用陰影:在F#中,當在特定範圍(判定塊,方法或內部類)中聲明的變量與在外部範圍中聲明的變量名稱相同時,會發生值陰影。

如果你想有一個可變值,有F#中syntaxe:

let mutable a = 10 
a <- a + 1 
+0

你能否在這裏詳細說明,因爲它看起來像變量在相同的範圍內進行了變異。注意''let a = a + 1'' – bradgonesurfing 2013-04-21 19:20:30

+1

@bradgonesurfing:你只需要兩個同名的(_different_)值。 – ildjarn 2013-04-21 19:30:58

+0

好吧,我只是在FSI說服了自己。但是,這個FSI是用雙冒號'';;''特定的還是總是這樣工作的? – bradgonesurfing 2013-04-21 19:35:00

5

由於已經由亞瑟,你看到的是陰影這意味着原來的「變量」命名a解釋被名爲a的新「變量」隱藏(我在引號中使用變量,因爲它們實際上是不可變的值)。

要看到其中的差別,你可以在一個函數獲取原始值,然後隱藏原始值後,打印出值:

> let a = 10;;    // Define the original 'a' value 
val a : int = 10 

> let f() = a;;    // A function captures the original value  
val f : unit -> int 

> let a = 42;;    // Define a new value hiding the first 'a' 
val a : int = 42 

> f();;      // Prints the original value - it is not mutated! 
val it : int = 10 

可悲的是,你不能使用完全相同的代碼,看看如何let mutable的行爲(因爲F#不允許捕捉封可變參考),但你可以看到突變,當您使用參考單元(也就是一個簡單的對象,在堆存儲可變值):

> let a = ref 10;;    // Create a mutable reference cell initialized to 10 
val a : int ref = {contents = 10;} 

> let f() = !a;;    // A function reads the current value of the cell  
val f : unit -> int 

> a := 42;;     // Overwrite the value in the cell with 42 
val it : unit =() 

> f();;      // Prints the new value - it is mutated 
val it : int = 42 

您可以在F#interactive中逐行運行代碼,但是當您複製整個代碼片段(輸入行)並將它們放入正常的F#代碼中時,它會執行完全相同的操作。在一個函數或模塊中。 ;;只是爲了結束F#交互式輸入(我在F#交互式窗口中鍵入代碼)中的行,但它在普通代碼中不需要,因爲F#使用縮進找出語句結束的位置。