2015-11-02 64 views
3

我在看F#爲C#開發人員書,有這個功能,我似乎無法瞭解什麼是 F#不清楚功能的影響

let tripleVariable = 1, "two", "three" 
let a, b, c = tripleVariable 
let l = [(1,2,3); (2,3,4); (3,4,5)] 
for a,b,c in l do 
    printfn "triple is (%d,%d,%d)" a b c 

輸出 這個函數的作用

triple is (1,2,3) 
triple is (2,3,4) 
triple is (3,4,5) 

爲什麼abctripleVariable初始化?是否因爲需要在for循環中知道它們的類型(或其類型,因爲它是Tuple)?定義變量abc

回答

4

該代碼包含樣本。第一個是

let tripleVariable = 1, "two", "three" 
let a, b, c = tripleVariable 

第二屆一個

let l = [(1,2,3); (2,3,4); (3,4,5)] 
for a,b,c in l do 
    printfn "triple is (%d,%d,%d)" a b c 

它們可以獨立運行。

ab,並在forc隱藏abc環路之外定義。您可以在循環後打印ab,並c看到他們仍然包含來自tripleVariable值:

let tripleVariable = 1, "two", "three" 
let a, b, c = tripleVariable 

let l = [(1,2,3); (2,3,4); (3,4,5)] 
for a,b,c in l do 
    printfn "triple is (%d,%d,%d)" a b c 

printfn "tripleVariable is (%A,%A,%A)" a b c 

結果:

triple is (1,2,3) 
triple is (2,3,4) 
triple is (3,4,5) 
tripleVariable is (1,"two","three") 
6

代碼段使用可變陰影。變量首先被初始化爲值tripleVariable(第二行),然後它們被遮蔽通過在for循環內的新定義(第4行)。

你可以把這些不同的變量 - 代碼等同於以下:

let tripleVariable = 1, "two", "three" 
let a1, b1, c1 = tripleVariable 
let l = [(1,2,3); (2,3,4); (3,4,5)] 
for a2, b2, c2 in l do 
    printfn "triple is (%d,%d,%d)" a2 b2 c2 

可變陰影只是讓你定義一個變量已存在於作用域的名稱。它隱藏了舊的變量,所有後續的代碼只會看到新的變量。在上面的代碼片段中,舊的(陰影)變量bc甚至與新的變量類型不同。

+0

學究角落:他們是* *值,不變量,除非它們被標記爲「可變」。 –