元组 (F#)
“元组”是一些未命名但经过排序的值的分组,这些值可能具有不同的类型。
( element , ... , element )
备注
前面语法中的每个 element 可以是任何表达式。
示例
元组的示例包括相同或不同类型的二重元组、三重元组等。 下面的代码中阐释了一些示例。
// 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)
获取各个值
您可以使用模式匹配来访问元组元素以及为其分配名称,如下面的代码中所示。
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
您可以在 let 绑定中使用元组模式,如下所示。
let (a, b) = (1, 2)
此代码同时绑定值 a 和 b。 如果只需要元组的一个元素,则可以使用通配符字符(下划线)来避免为不需要的变量创建新名称。
let (a, _) = (1, 2)
函数 fst 和 snd 分别返回元组的第一个和第二个元素。
let c = fst (1, 2)
let d = snd (1, 2)
没有可返回三重元组的第三个元素的内置函数,但您可按如下方式轻松地编写一个函数。
let third (_, _, c) = c
通常,最好使用模式匹配来访问各个元组元素。
使用元组
利用元组可以方便地从一个函数中返回多个值,如下例所示。 此示例执行整数除法并返回该操作的舍入结果作为元组对的第一个成员,余数作为二重元组的第二个成员。
let divRem a b =
let x = a / b
let y = a % b
(x, y)
如果需要避免隐式扩充常见函数语法所隐含的函数参数,也可以将元组用作函数参数。
let sumNoCurry (a, b) = a + b
用于定义函数 let sum a b = a + b 的常见语法使您能够定义一个函数,该函数部分应用函数的第一个参数,如下面的代码所示。
let addTen = sum 10
let result = addTen 95
// Result is 105.
使用元组作为参数将禁用扩充。 有关更多信息,请参见函数 (F#) 中的“参数的部分应用”。
元组类型的名称
在编写作为元组的类型的名称时,使用 * 符号来分隔元素。 对于由 int、float 和 string 组成的元组,例如 (10, 10.0, "ten"),应按如下方式编写类型。
int * float * string
元组的编译形式
如果您只是在 F# 中使用元组,而不向其他语言公开这些元组,则在不是以版本 4 之前的 .NET Framework 版本为目标的情况下,可以忽略此节。
元组将会编译到若干个泛型类型(全部命名为 Tuple)之一的对象中,这些类型针对 arity(或类型参数的数目)进行重载。 当从其他语言(如 C# 或 Visual Basic)查看元组类型时,或者当使用无法识别 F# 构造的工具时,将以此形式显示元组类型。 Tuple 类型是在 .NET Framework 4 版中引入的。 如果以 .NET Framework 的较早版本为目标,则编译器使用 F# 核心库的 2.0 版中的 System.Tuple 版本。 该库中的类型仅用于以 .NET Framework 2.0 版、3.0 版和 3.5 版为目标的应用程序。 类型转发可用于确保 .NET Framework 2.0 和 .NET Framework 4 F# 组件之间的二进制兼容性。