F 學習之路 7 集合型別

2021-06-27 05:10:33 字數 2536 閱讀 2934

一、陣列型別 (array)

陣列型別,在語義上表示一組相同型別的集合。這個跟列表(list)相似,兩者的區別在於列表型別資料元素不可變,而陣列型別可以。雖然陣列型別隨機訪問,在查詢訪問上效能優先列表,但列表在變更集合(增加、刪除集合元素)上有更好的效能。這個跟大多數語言是相似的。

定義陣列型別的語法,跟列表也很相似,區別在於陣列多了兩個"|"符合。

letarr=[|1

;2;3

|]letjaggedarr=[|[

|1;2

|];[|

3;4;

5|]|

] arr為一維陣列,型別為int array。jaggedarr陣列為int array array

f#陣列與c#很相似,有兩種類別的陣列,一種叫矩形(rectangle)陣列,另一種叫鋸齒(jagged)陣列

矩形陣列,在數字意義上,就是矩陣(matrix),一維陣列也叫向量或向量(vector)。注意鋸齒陣列內嵌的陣列長度不相等。

在f#中共定義了三個模組來處理陣列型別。array,array2,array3,分別用來處理一維、二維、三維陣列。

#light

leta=array2.create 

1020

0array2.iteri (

funi j item

->

printfn 

"no %d,%d :%a

"i j item) a

system.console.readkey(

true) |

>ignore

a型別為int [,],是乙個二維陣列。

leta=array2.create 

1020

0a.[5,

5]<-

8array2.iteri (

funi j item

->

printfn 

"no %d,%d :%a

"i j item) a   

letarr=[|1

;3;4

|]printfn "%a

"arr.[0..

2]letc=[|[

|1;2

|];[|

3;4;

5|]|

]printfn "%d

"(c.[

1].[2])

從上面的**可以看出,f#除支援與c#類似的訪問方法外,還對一維陣列支援範圍區間訪問語法。     

二、可變陣列型別(resizearray)

resizearray型別,只是.net 型別 system.collections.generic.list泛型型別的別名。resizearray長度可變,資料元素可變,很顯然這個型別難以保證執行緒安全,應優先使用f#的list型別。

letb=

newresizearray<_>()

b.addrange(seq)

b.[5

]<-

8b.foreach((

funi

->

printfn "%d

"i))

三、鍵值對型別map。

map型別,不同於.net的system.collections.generic.dictionary型別,map型別是不可變型別。

letm=map.add 1"

1"map.empty

forv 

inm 

doprintfn "%a

"vletn=map.of_list [

forkey in1

..100

doyield key,key.tostring()]n |

>map.iter (

funkey value 

->

printfn 

"%d %s

"key value)

上面的**可以看出map.add函式建立map型別比較麻煩,通過of_list,of_array,of_seq等函式建立字典比較方便。

四、set型別

set型別,不同於list之處,在於集合中資料是唯一的,不存在兩條相等的資料成員。

set.of_list ["1

";"2

";"1

"] |>set.iter (

funitem 

->

printfn "%s

"item) 

//1 2

set型別,還支援兩個set型別的相交、合併,取子集合等操作     

set.of_seq (

seq )

- set.of_list [1;

3;6] 

|> set.iter (

funitem 

->

printfn "%d

"item) 

//2;4;5;7;8;9;10

集合在日常程式設計中佔據了重要了位置,本文對f#集合型別的技術細節沒有進行討論。

接下來,我就集中研究函式式程式設計中一些高階特性,例如組合子,cps,monad。希望條件成熟,我另開乙個系列來討論。

7 集合概述

陣列 儲存同一種型別資料的容器 陣列的特點 1 只能儲存同一種型別的資料 2.一旦初始化,長度固定 3 陣列中元素之間的位址是連續的。注意 object 陣列可以儲存任意型別的元素。object 是物件始祖。集合 儲存物件資料的集合容器。容器 好好的理解 容器,這種說法還是比較形象的 集合比陣列的有...

python的學習之路(2) 集合

序言 這一篇主要講集合 集合是無序的且不重複的元素序列 我們可以使用或者set 函式建立集合 但是當建立空集合時必須使用set 因為直接使用 是表示建立乙個空字典。示例 使用 fruits 或者set set fruit 得到如下 fruits。add x 將元素x 將元素x新增到集合fruits中...

Python學習之路day3 集合

集合 set 是一種無序且不重複的序列。無序不重複的特點決定它存在以下的應用場景 差集 並集 交集等,下文詳述。建立集合的方法與建立字典類似,但沒有鍵值對的概念,具體如下 s1 還可以通過以下兩種方法建立 s2 set s3 set 11,22,33 這兩種方法本質上是同一種,都是通過呼叫系統的se...