Tuple 是一組未命名但已排序的值,可能是不同類型的。 Tuple 可以是參考型別或結構。
語法
(element, ... , element)
struct(element, ... ,element )
備註
上一個語法中的每個 元素 都可以是任何有效的 F# 運算式。
範例
Tuple 的範例包括相同或不同類型的配對、三重等。 下列程式代碼說明一些範例。
(1, 2)
// Triple of strings.
("one", "two", "three")
// Tuple of generic types.
(a, b)
// Tuple that has mixed types.
("one", 1, 2.0)
// Tuple of integer expressions.
(a + 1, b + 1)
// Struct Tuple of floats
struct (1.025f, 1.5f)
取得個別值
您可以使用模式比對來存取和指派 Tuple 元素的名稱,如下列程式代碼所示。
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
您也可以透過系結,透過let運算式外部的match模式比對來解構 Tuple:
let (a, b) = (1, 2)
// Or as a struct
let struct (c, d) = struct (1, 2)
或者,您可以將 Tuple 上的模式比對為函式的輸入:
let getDistance ((x1,y1): float*float) ((x2,y2): float*float) =
// Note the ability to work on individual elements
(x1*x2 - y1*y2)
|> abs
|> sqrt
如果您只需要 Tuple 的一個專案,可以使用通配符(底線)來避免為不需要的值建立新的名稱。
let (a, _) = (1, 2)
從參考元組將元素複製到結構元組也很簡單:
// Create a reference tuple
let (a, b) = (1, 2)
// Construct a struct tuple from it
let struct (c, d) = struct (a, b)
fst函式和 snd (僅限參考 Tuple) 分別傳回 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)
當您想要避免一般函式語法所隱含的函式自變數隱含 curry 時,Tuple 也可以當做函式自變數使用。
let sumNoCurry (a, b) = a + b
定義函式的一般語法 let sum a b = a + b 可讓您定義函式,該函式是函式第一個自變數的部分應用程式,如下列程式代碼所示。
let sum a b = a + b
let addTen = sum 10
let result = addTen 95
// Result is 105.
使用 Tuple 做為參數會停用 currying。 如需詳細資訊,請參閱 函式中的。
Tuple 類型的名稱
當您寫出為 Tuple 的類型名稱時,您可以使用 * 符號來分隔元素。 針對包含 int、、 float和 string的 Tuple,例如 (10, 10.0, "ten"),類型會寫入如下。
int * float * string
請注意,在為結構元組類型建立類型別名時,外部括號是必要的。
type TupleAlias = string * float
type StructTupleAlias = (struct (string * float))
與 C# Tuple 互作
C# 中的 Tuple 是結構,相當於 F# 中的結構 Tuple。 如果您需要與 C# 互作,則必須使用結構元組。
這很容易做到。 例如,假設您必須將 Tuple 傳遞至 C# 類別,然後取用其結果,也就是 Tuple:
namespace CSharpTupleInterop
{
public static class Example
{
public static (int, int) AddOneToXAndY((int x, int y) a) =>
(a.x + 1, a.y + 1);
}
}
在 F# 程式代碼中,您可以接著傳遞結構元組做為 參數,並以結構元組的形式取用結果。
open TupleInterop
let struct (newX, newY) = Example.AddOneToXAndY(struct (1, 2))
// newX is now 2, and newY is now 3
在參考元組與結構元組之間轉換
由於參考 Tuple 和結構 Tuple 具有完全不同的基礎表示法,因此無法隱含轉換。 也就是說,如下列程式代碼不會編譯:
// Will not compile!
let (a, b) = struct (1, 2)
// Will not compile!
let struct (c, d) = (1, 2)
// Won't compile!
let f(t: struct(int*int)): int*int = t
您必須在一個 Tuple 上進行模式比對,並使用組成元件建構另一個 Tuple。 例如:
// Pattern match on the result.
let (a, b) = (1, 2)
// Construct a new tuple from the parts you pattern matched on.
let struct (c, d) = struct (a, b)
已編譯的參考元組形式
本節說明在編譯 Tuple 時的格式。 除非您以 .NET Framework 3.5 或更低版本為目標,否則不需要讀取此處的資訊。
Tuple 會編譯成數個泛型類型的其中一個對象,這些泛型類型都是在 System.Tuplearity上多載,或類型參數的數目。 當您從其他語言檢視 Tuple 類型,例如 C# 或 Visual Basic,或是當您使用不知道 F# 建構的工具時,Tuple 類型會出現在此表單中。 類型 Tuple 是在 .NET Framework 4 中引進的。 如果您的目標是舊版 .NET Framework,編譯程式會使用 System.Tuple 2.0 版 F# 核心連結庫的 版本。 此連結庫中的類型僅適用於以 2.0、3.0 和 3.5 版 .NET Framework 為目標的應用程式。 類型轉送是用來確保 .NET Framework 2.0 與 .NET Framework 4 F# 元件之間的二進位兼容性。
結構元組的編譯形式
結構元組 (例如, struct (x, y)), 與參考元組基本上不同。 它們會編譯成 ValueTuple 類型、依arity多載,或類型參數的數目。 它們相當於 C# Tuple 和 Visual Basic Tuple,並雙向互作。