Tuple (F#)
Tuple 是不具名但有先後順序之值 (型別可能不同) 的群組。
( element , ... , element )
備註
前一個語法中的每個 element 都可以是任何運算式。
範例
Tuple 範例包括相同或不同型別的雙重組、三重組等。 下列程式碼說明部分範例。
// Tuple of two integers.
( 1, 2 )
// Triple of strings.
( "one", "two", "three" )
// Tuple of unknown types.
( a, b )
// Tuple that has mixed types.
( "one", "1", "2.0" )
// Tuple of integer expressions.
( a + 1, b + 1)
取得個別值
您可以使用模式比對來存取以及指派 Tuple 項目的名稱,如下列程式碼所示。
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
您可以在 let 繫結中使用 Tuple 模式,如下所示。
let (a, b) = (1, 2)
這會同時繫結 a 和 b 值。 如果您只需要 Tuple 的一個項目,則可以使用萬用字元 (底線),避免為不需要的變數建立新名稱。
let (a, _) = (1, 2)
函式 fst 和 snd 會分別傳回 Tuple 的第一個和第二個項目。
let c = fst (1, 2)
let d = snd (1, 2)
沒有可傳回三重組之第三個項目的內建函式,但是您可以輕鬆撰寫一個函式,如下所示。
let third (_, _, c) = c
通常最好使用模式比對來存取個別的 Tuple 項目。
使用 Tuple
Tuple 提供方便的方式,從函式傳回多個值,如下列範例所示。 這個範例會執行整數除法,並傳回這項運算的捨入結果做為 Tuple 雙重組的第一個成員,而將餘數做為雙重組的第二個成員。
let divRem a b =
let x = a / b
let y = a % b
(x, y)
當您要避免一般函式語法所表示的函式引數發生隱含局部調用時,也可以使用 Tuple 做為函式引數。
let sumNoCurry (a, b) = a + b
用於定義 let sum a b = a + b 函式的一般語法可讓您定義做為部分套用第一個函式引數的函式,如下列程式碼所示。
let addTen = sum 10
let result = addTen 95
// Result is 105.
使用 Tuple 做為參數會停用局部調用。 如需詳細資訊,請參閱函式 (F#) 中的<部分套用引數>。
Tuple 型別名稱
當您撰寫做為 Tuple 的型別名稱時,* 符號是用來分隔項目。 對於由 int、float 和 string 組成的 Tuple (例如 (10, 10.0, "ten")),型別撰寫如下。
int * float * string
Tuple 的編譯形式
如果您只使用 F# 中的 Tuple,而不向其他語言公開它們,而且您的目標不是設為 .NET Framework 第 4 版之前的版本,則可以略過本節。
Tuple 會編譯為在 Arity 上多載之其中一種泛型型別的物件 (全都命名為 Tuple) 或型別參數的數目。 如果您透過另一種語言 (例如 C# 或 Visual Basic) 檢視 Tuple 型別,或使用無法辨識 F# 建構的工具,則 Tuple 型別會以此形式顯示。 在 .NET Framework 4 中,已引進 Tuple 型別。 如果您的目標是舊版 .NET Framework,則編譯器會使用 2.0 版的 F# 核心程式庫的 System.Tuple 版本。 這個程式庫中的型別只適用於以 2.0、3.0 和 3.5 版的 .NET Framework 為目標的應用程式。 型別轉送是用來確定 .NET Framework 2.0 與 .NET Framework 4 F# 元件之間的二進位相容性。