Chapter3 - 列表 - List
时间:2010-09-17 来源:兴说:
F#的列表是一种简单的内置集合类型。F#的列表可以是一个空的列表([]),或者是一些值的集合
你可以用 :: 来连接许多的项
let emptyList = []
let oneItem = "one" :: []
let twoItem = "one" :: "two" :: []
你也可以在初始化列表的时候使用;来分隔列表里的项
let shortHand = ["apples" ; "pairs"]
F#还提供了 @ ,你可以用这个操作符来连接两个列表
let twoLists = ["one" ; "two"] @ ["buckle" ; "my" ; "shoe"]
在同一个列表里的项都必须是同一个类型的,如果你想在里面塞一些不一样的东西进去的华。
编译器将会报出一个错误。当然,你可以强制的使用 box 关键字将列表的类型都处理为object,
但这样就少不了一些装箱、拆箱的消耗。
let objList = [box 1; box 2.0; box "three"]
当你在 F# Interactive 中输入上面这行代码的时候会返回:
val objList : obj list = [1; 2.0; "three"]
//很明显的,这里就是一个obj 的 list
在F#里面,列表是不可改变的(immutable),也就是说,一旦这个列表给创建了,他就不能
在接受更改,之前提到的函数跟操作符,事实上并没有对其做任何修改,他只是创建了一个新的列表出来
let one = ["one "]
//one为 ["one"]
let two = "two " :: one
//two为 ["two","one"]
let three = "three" : two
//three为 ["three","two","one"]
let rightWayRound = List.rev three
// ["one","two","three"]
以上的操作并没有对每个列表做修改,他只是复制了一份,然后又生成了一份新的列表
递归是最普通的使用列表的方式。如以下的代码,链接多个列表
let listOfList = [[2;3;5]; [7;11;13]; [17;19;23;29]]
let rec concatList l =
if List.nonempty l then
let head = List.hd l in //让head等于列表中的第一个元素
let tail = List.tl l in //让tail等于列表中的剩余元素
head @ (concatList tail) //head 跟 concatList的下一个返回结果链接
else
[] //如果传递进来的是空列表,则返回空列表
concatList listOfList
//结果 [2;3;5;7;11;13;17;19;23;29]
相关阅读 更多 +