元组类型,表示一组有序数据类型的集合。F#通过支持元组类型,方便了我们定义临时数据结构,而不需要为了临时的数据专门定义一个数据类型。
一、元组的定义:
let tuple_2=(1,2)
let tuple_3=("F#",1.9,"F# Function Language")
在F#中元组使用小括号,元素之间逗号分隔来定义。元组元素可以是任何类型。
上面代码中,tuple_2的类型是int*int,而tuple_3的类型为string*float*string。元组类型使用元组元素类型乘号连接的方式。
元组类型可以作为函数的输入参数,也可以作为函数的返回值。
let test (a,b,c) =
a+1,b+2,c+3
上面函数的类型为 int*int*int->int*int*int
元组类型虽然方便我们组织一组数据类型,而无需专门定义一个数据结构。但很显然他不能很好地帮助我们理解数据结构的语义,尤其是互操作时作为函数返回值的情况下。给元组类型取一个别名,能够部分缓解这个问题。
type FSharpDesc=string*float*string
let getFSharpDesc ():FSharpDesc =
("F#",1.9,"F# Function Language")
二、元组类型的比较
在F#中元组类型可以进行比较,前提当然是同类型的元组类型。所谓同类型,是指元组的元素长度相等,元素类型相同。F#从前至后依次比较。
do printfn "%b" ((1,2,3,4,5,6,7,8,9) <(2,1,2,3,4,5,6,7,8))
打印的结果 为 true
三、元组与模式匹配
模式匹配在函数式语言中经常出现,其功能强大。比命令式语言中switch强大的多。不仅可以匹配基本类型、元组类型、列表类型、记录类型,还可以用于类型检测。在F#中还允许自定义类型的模式匹配,通过活动模式(Active Pattern)可以做到这一点。
let tuple_7=(1,2,3,4,5,6,(7,8,9))
let one,two,three,four,five,six,seven=tuple_7
[one;two;three;four;five;six;] @ (match seven with t1,t2,t3 ->[t1;t2;t3] )
|> List.iteri
(fun index item ->printfn "%d,%A" index item)
元组类型不仅可以使用常用的模式匹配方法。
match seven with t1,t2,t3 ->[t1;t2;t3]
还可以使用隐式的模式匹配方法来分解元组
let one,two,three,four,five,six,seven=tuple_7
这种隐式的模式匹配大大方便了我们使用元组类型的分解。上面的代码使用了列表,列表将在下一篇博客中讨论。