Chapter3 - 列表 - List


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]


posted on 2010-09-17 13:49  兴说:  阅读(344)  评论(0编辑  收藏  举报