具有模式匹配的遞迴列表處理

這裡我們演示如何使用 OCaml 的模式匹配語法遞迴處理列表。

let rec map f lst =
  match lst with
  | [] -> []
  | hd::tl -> (f hd)::(map f tl)

在這種情況下,模式 [] 匹配空列表,而 hd::tl 匹配任何具有至少一個元素的列表,並將列表的第一個元素分配給 hd,列表的其餘部分(可以為空)分配給 tl

請注意,hd::tl 是一種非常通用的模式,它將匹配任何非空的列表。我們還可以編寫與具有特定數量元素的列表匹配的模式:

(* Return the last element of a list. Fails if the list is empty. *)
let rec last lst =
  match lst with
  | [] -> failwith "Empty list"
  | [x] -> x (* Equivalent to x::[], [x] matches a list with only one element *)
  | hd::tl -> last tl

(* The second to last element of a list. *)
let rec second_to_last lst =
  match lst with
  | [] -> failwith "Empty list"
  | x::[] -> failwith "Singleton list"
  | fst::snd::[] -> snd
  | hd::tl -> second_to_last tl

此外,OCaml 支援列表本身元素的模式匹配。我們可以更具體地瞭解列表中元素的結構,OCaml 將推斷出正確的函式型別:

(* Assuming a list of tuples, return a list with first element of each tuple. *)
let rec first_elements lst =
  match lst with
  | [] -> []
  | (a, b)::tl -> a::(first_elements tl)
(* val first_elements : ('a * 'b) list -> 'a list = <fun> *)

通過將這些模式組合在一起,我們可以處理任何任意複雜的列表。