在这里,我们演示了如何使用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> *)
通过将这些模式组合在一起,我们可以处理任何任意复杂的列表。