模組 List

module List: sig .. end

列表操作。

有些函式被標記為非尾遞迴。尾遞迴函式使用固定的堆疊空間,而非尾遞迴函式使用的堆疊空間與其列表引數的長度成正比,這對於非常長的列表來說可能會是個問題。當函式接受多個列表引數時,會顯示一個近似公式來表示堆疊使用量(以某些未指定的常數單位)。

如果您的列表長度不超過 10000 個元素,通常可以忽略上述考量。

此模組的標籤版本可以使用 StdLabels 模組中的描述方式。


type 'a t = 'a list = 
| []
| (::) of 'a * 'a list

列表類型的別名。

val length : 'a list -> int

返回給定列表的長度(元素數量)。

val compare_lengths : 'a list -> 'b list -> int

比較兩個列表的長度。compare_lengths l1 l2 等同於 compare (length l1) (length l2),但計算會在到達最短列表的末尾後停止。

val compare_length_with : 'a list -> int -> int

比較列表的長度與整數。compare_length_with l len 等同於 compare (length l) len,但計算會在列表上最多執行 len 次迭代後停止。

val is_empty : 'a list -> bool

is_empty l 為真,當且僅當 l 沒有任何元素。它等同於 compare_length_with l 0 = 0

val cons : 'a -> 'a list -> 'a list

cons x xs 等同於 x :: xs

val hd : 'a list -> 'a

返回給定列表的第一個元素。

val tl : 'a list -> 'a list

返回給定列表,但不包含第一個元素。

val nth : 'a list -> int -> 'a

返回給定列表的第 n 個元素。第一個元素(列表頭部)的位置為 0。

val nth_opt : 'a list -> int -> 'a option

返回給定列表的第 n 個元素。第一個元素(列表頭部)的位置為 0。如果列表太短,則返回 None

val rev : 'a list -> 'a list

列表反轉。

val init : int -> (int -> 'a) -> 'a list

init len f[f 0; f 1; ...; f (len-1)],由左至右進行評估。

val append : 'a list -> 'a list -> 'a list

append l0 l1l1 附加到 l0。與中綴運算子 @ 的功能相同。

val rev_append : 'a list -> 'a list -> 'a list

rev_append l1 l2l1 反轉並與 l2 連接。這等同於 (List.rev l1) @ l2

val concat : 'a list list -> 'a list

連接列表的列表。引數中的所有元素都(以相同的順序)連接在一起以產生結果。非尾遞迴(引數的長度 + 最長子列表的長度)。

val flatten : 'a list list -> 'a list

List.concat 相同。非尾遞迴(引數的長度 + 最長子列表的長度)。

比較

val equal : ('a -> 'a -> bool) -> 'a list -> 'a list -> bool

equal eq [a1; ...; an] [b1; ..; bm] 在兩個輸入列表具有相同的長度,且對於在相同位置的每一對元素 aibi,我們都有 eq ai bi 時成立。

注意:即使列表長度不同,也可能會呼叫 eq 函式。如果您知道您的相等函式很耗費效能,您可能會想先檢查 List.compare_lengths

val compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int

compare cmp [a1; ...; an] [b1; ...; bm] 使用與 compare 相同的 '-> '-> int 介面,對兩個輸入列表執行字典比較。

  • 如果 a1 小於 a2,或者它們相等(結果為 0)且 l1 小於 l2,則 a1 :: l1 小於 a2 :: l2(結果為負數)。
  • 空列表 [] 嚴格小於非空列表。

注意:即使列表長度不同,也將會呼叫 cmp 函式。

迭代器

val iter : ('a -> unit) -> 'a list -> unit

iter f [a1; ...; an] 依次將函式 f 應用於 [a1; ...; an]。它等同於 f a1; f a2; ...; f an

val iteri : (int -> 'a -> unit) -> 'a list -> unit

List.iter 相同,但該函式會將元素的索引(從 0 開始計算)作為第一個引數,並將元素本身作為第二個引數。

val map : ('a -> 'b) -> 'a list -> 'b list

map f [a1; ...; an] 將函式 f 應用於 a1, ..., an,並使用 f 返回的結果建構列表 [f a1; ...; f an]

val mapi : (int -> 'a -> 'b) -> 'a list -> 'b list

List.map 相同,但該函式會將元素的索引(從 0 開始計算)作為第一個引數,並將元素本身作為第二個引數。

val rev_map : ('a -> 'b) -> 'a list -> 'b list

rev_map f l 給出的結果與 List.rev (List.map f l) 相同,但效率更高。

val filter_map : ('a -> 'b option) -> 'a list -> 'b list

filter_map f lf 應用於 l 的每個元素,篩選掉 None 元素,並返回 Some 元素的引數列表。

val concat_map : ('a -> 'b list) -> 'a list -> 'b list

concat_map f l 給出的結果與 List.concat (List.map f l) 相同。尾遞迴。

val fold_left_map : ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a list -> 'acc * 'b list

fold_left_mapfold_leftmap 的組合,它將累加器透過對 f 的呼叫進行傳遞。

val fold_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a list -> 'acc

fold_left f init [b1; ...; bn]f (... (f (f init b1) b2) ...) bn

val fold_right : ('a -> 'acc -> 'acc) -> 'a list -> 'acc -> 'acc

fold_right f [a1; ...; an] initf a1 (f a2 (... (f an init) ...))。非尾遞迴。

兩個列表的迭代器

val iter2 : ('a -> 'b -> unit) -> 'a list -> 'b list -> unit

iter2 f [a1; ...; an] [b1; ...; bn] 依次呼叫 f a1 b1; ...; f an bn

val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list

map2 f [a1; ...; an] [b1; ...; bn][f a1 b1; ...; f an bn]

val rev_map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list

rev_map2 f l1 l2 給出的結果與 List.rev (List.map2 f l1 l2) 相同,但效率更高。

val fold_left2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a list -> 'b list -> 'acc

fold_left2 f init [a1; ...; an] [b1; ...; bn]f (... (f (f init a1 b1) a2 b2) ...) an bn

val fold_right2 : ('a -> 'b -> 'acc -> 'acc) -> 'a list -> 'b list -> 'acc -> 'acc

fold_right2 f [a1; ...; an] [b1; ...; bn] initf a1 b1 (f a2 b2 (... (f an bn init) ...))

列表掃描

val for_all : ('a -> bool) -> 'a list -> bool

for_all f [a1; ...; an] 檢查列表中的所有元素是否都滿足謂詞 f。也就是說,對於非空列表,它返回 (f a1) && (f a2) && ... && (f an);如果列表為空,則返回 true

val exists : ('a -> bool) -> 'a list -> bool

exists f [a1; ...; an] 檢查列表中是否至少有一個元素滿足謂詞 f。也就是說,對於非空列表,它返回 (f a1) || (f a2) || ... || (f an);如果列表為空,則返回 false

val for_all2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

List.for_all 相同,但適用於雙引數謂詞。

val exists2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

List.exists 相同,但適用於雙引數謂詞。

val mem : 'a -> 'a list -> bool

mem a set 為真,當且僅當 a 等於 set 的一個元素。

val memq : 'a -> 'a list -> bool

List.mem 相同,但使用實體相等性而非結構相等性來比較列表元素。

列表搜尋

val find : ('a -> bool) -> 'a list -> 'a

find f l 返回列表中第一個滿足謂詞 f 的元素 l

val find_opt : ('a -> bool) -> 'a list -> 'a option

find f l 返回列表中第一個滿足謂詞 f 的元素 l。如果列表 l 中沒有任何值滿足 f,則返回 None

val find_index : ('a -> bool) -> 'a list -> int option

find_index f xs 返回 Some i,其中 i 是列表 xs 中第一個滿足 f x 的元素的索引(如果存在此類元素)。

如果沒有此類元素,則返回 None

val find_map : ('a -> 'b option) -> 'a list -> 'b option

find_map f l 依序將 f 應用於 l 的元素,並回傳第一個形式為 Some v 的結果,如果不存在則回傳 None

val find_mapi : (int -> 'a -> 'b option) -> 'a list -> 'b option

find_map 相同,但謂詞會將元素的索引 (從 0 開始計數) 作為第一個參數,元素本身作為第二個參數。

val filter : ('a -> bool) -> 'a list -> 'a list

filter f l 回傳列表 l 中所有滿足謂詞 f 的元素。輸入列表中元素的順序會被保留。

val find_all : ('a -> bool) -> 'a list -> 'a list

find_allList.filter 的另一個名稱。

val filteri : (int -> 'a -> bool) -> 'a list -> 'a list

List.filter 相同,但謂詞會將元素的索引 (從 0 開始計數) 作為第一個參數,元素本身作為第二個參數。

val partition : ('a -> bool) -> 'a list -> 'a list * 'a list

partition f l 回傳一對列表 (l1, l2),其中 l1 是列表 l 中所有滿足謂詞 f 的元素所組成的列表,而 l2 是列表 l 中所有不滿足 f 的元素所組成的列表。輸入列表中元素的順序會被保留。

val partition_map : ('a -> ('b, 'c) Either.t) -> 'a list -> 'b list * 'c list

partition_map f l 回傳一對列表 (l1, l2),對於輸入列表 l 的每個元素 x 而言:

  • 如果 f xLeft y1,則 y1 會在 l1 中,並且
  • 如果 f xRight y2,則 y2 會在 l2 中。

輸出元素會以與 l 中對應輸入元素相同的相對順序包含在 l1l2 中。

特別的是,partition_map (fun x -> if f x then Left x else Right x) l 等同於 partition f l

關聯列表

val assoc : 'a -> ('a * 'b) list -> 'b

assoc a l 回傳在配對列表 l 中與鍵值 a 相關聯的值。也就是說,如果 (a,b) 是列表 la 最左邊的繫結,則 assoc a [ ...; (a,b); ...] = b

val assoc_opt : 'a -> ('a * 'b) list -> 'b option

assoc_opt a l 回傳在配對列表 l 中與鍵值 a 相關聯的值。也就是說,如果 (a,b) 是列表 la 最左邊的繫結,則 assoc_opt a [ ...; (a,b); ...] = Some b。如果列表 l 中沒有與 a 相關聯的值,則回傳 None

val assq : 'a -> ('a * 'b) list -> 'b

List.assoc 相同,但使用實體相等性而不是結構相等性來比較鍵值。

val assq_opt : 'a -> ('a * 'b) list -> 'b option

List.assoc_opt 相同,但使用實體相等性而不是結構相等性來比較鍵值。

val mem_assoc : 'a -> ('a * 'b) list -> bool

List.assoc 相同,但如果存在繫結則直接回傳 true,如果給定的鍵值不存在繫結則回傳 false

val mem_assq : 'a -> ('a * 'b) list -> bool

List.mem_assoc 相同,但使用實體相等性而不是結構相等性來比較鍵值。

val remove_assoc : 'a -> ('a * 'b) list -> ('a * 'b) list

remove_assoc a l 回傳不包含第一個鍵值為 a 的配對 (如果有的話) 的配對列表 l。不是尾遞迴。

val remove_assq : 'a -> ('a * 'b) list -> ('a * 'b) list

List.remove_assoc 相同,但使用實體相等性而不是結構相等性來比較鍵值。不是尾遞迴。

成對的列表

val split : ('a * 'b) list -> 'a list * 'b list

將配對列表轉換為配對列表:split [(a1,b1); ...; (an,bn)] 會是 ([a1; ...; an], [b1; ...; bn])。不是尾遞迴。

val combine : 'a list -> 'b list -> ('a * 'b) list

將配對列表轉換為配對列表:combine [a1; ...; an] [b1; ...; bn] 會是 [(a1,b1); ...; (an,bn)]

排序

val sort : ('a -> 'a -> int) -> 'a list -> 'a list

根據比較函數以遞增順序排序列表。如果其參數比較相等,比較函數必須回傳 0;如果第一個較大,則回傳正整數;如果第一個較小,則回傳負整數 (請參閱 Array.sort 以取得完整規範)。例如,compare 是一個合適的比較函數。產生的列表會以遞增順序排序。List.sort 保證在常數堆積空間 (除了結果列表的大小) 和對數堆疊空間中執行。

目前實作使用合併排序。它在常數堆積空間和對數堆疊空間中執行。

val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list

List.sort 相同,但排序演算法保證是穩定的 (也就是說,比較相等的元素會保持其原始順序)。

目前實作使用合併排序。它在常數堆積空間和對數堆疊空間中執行。

val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list

List.sortList.stable_sort 相同,取決於哪個在典型輸入上速度更快。

val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list

List.sort 相同,但也移除重複項目。

val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list

合併兩個列表:假設 l1l2 已根據比較函數 cmp 排序,merge cmp l1 l2 將回傳一個排序過的列表,其中包含 l1l2 的所有元素。如果多個元素比較相等,l1 的元素會排在 l2 的元素之前。不是尾遞迴 (引數長度的總和)。

列表與序列

val to_seq : 'a list -> 'a Seq.t

在列表上迭代。

val of_seq : 'a Seq.t -> 'a list

從序列建立列表。