F#基础教程 列表
????? F#中的列表是F#內置的簡單集合類型。一個F#列表可以為空,用方括號代表([]),也可以是一組值的串聯。你可以使用F#內置的操作符(::)串聯一個列表。下面的例子給出一些示例,開始第一行為空列表,第二三行為使用(::)串聯多個字符串的列表。
#light
let emptyList = []
let oneItem = "one " :: []
let twoItem = "one " :: "two " :: []
????? 將值串聯的語法有點冗長,因此,如果你只是想定義一個列表,可以使用如下簡寫。這種速記法將列表項放在方括號之間,并用分號(;)隔開。
#light
let shortHand = ["apples "; "pairs "]
????? F#有一個二元操作符(@),你可以用它連接兩個列表,示例如下:
let twoLists = ["one, "; "two, "] @ ["buckle "; "my "; "shoe "]
????? 在F#列表中所有的項目必須是同一類型。如果你嘗試在列表中包含不同的類型,例如,嘗試包含一個字符串和整數,你會得到一個編譯錯誤。如果你需要一個混合類型的列表,你可以創建一個類型為obj(F#里的System.Object)的列表。如下示例。
#light
let emptyList = []
let oneItem = "one " :: []
let twoItem = "one " :: "two " :: []
let shortHand = ["apples "; "pairs "]
let twoLists = ["one, "; "two, "] @ ["buckle "; "my "; "shoe "]
let objList = [box 1; box 2.0; box "three"]
let printList l =
List.iter print_string l
print_newline()
?
let main() =
printList emptyList
printList oneItem
printList twoItem
printList shortHand
printList twoLists
for x in objList do
print_any x
print_char ' '
print_newline()
main()
執行結果:
one
one two
apples pairs
one, two, buckle my shoe
1 2.000000 "three"
????? F#的列表是不可變的(它也是值類型)。換句話說,一旦你創建一個列表,它就不能改變。函數與運算符并不改變他們,而是創建一個新的,另一個版本的列表,舊的列表以后仍可使用。下面的例子演示了這一點,創建一個包含單一字符串的F#列表,然后創建兩個列表,每個都使用前一個做為基礎串聯。最后,List.rev函數應用于最后創建的列表執行逆轉。當你打印這些列表時,可以看出,所有的列表都保持定義時而未改變。不必擔心占用更多空間,不變量(值)對于垃圾回收程序是最易處理的。
#light
let one = ["one "]
let two = "two " :: one
let three = "three " :: two
let rightWayRound = List.rev three
let printList l =
List.iter print_string l
print_newline()
let main() =
printList one
printList two
printList three
printList rightWayRound
main()
執行結果:
one
two one
three two one
one two three
????? 最常使用列表的是遞歸表達式。空列表代表基本情況,當函數接收一個空列表時,函數終止返回。當函數接收一個非空列表,它的第一項(頭)被匹配處理,然后遞歸處理列表的其余部分(尾),下面示例演示了遞歸列表的使用。
#light
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
let tail = List.tl l in
head @ (concatList tail)
else
[]
let primes = concatList listOfList
print_any primes
????? 首先,定義了由三個列表組成的F#列表。然后,定義一個遞歸函數concatList,其目的是合并列表中的列表為一個列表。該函數使用了F#庫函數List.nonempty:檢查F#列表是否為空。如果不為空,取列表頭和列表尾,尾部調用函數本身,然后串聯到頭部;如果尾部為空,則返回空列表串聯,因為空列表的串聯對結果無影響。執行效果如下:
[2; 3; 5; 7; 11; 13; 17; 19; 23; 29]
????? concatList函數的定義比較冗長。幸運的是,F#包括一些針對于列表的模式匹配語法。將在以后章節介紹。
轉載于:https://www.cnblogs.com/IBBC/archive/2011/11/23/2260388.html
總結
- 上一篇: Applet实现Menu
- 下一篇: 填充整个页面