h :: t 模式匹配在 OCaml 中意味着什么?

Gue*_*OCs 1 ocaml functional-programming

我正在阅读https://ocaml.org/learn/tutorials/99problems.html它有两个例子:

# let rec last_two = function
    | [] | [_] -> None
    | [x;y] -> Some (x,y)
    | _::t -> last_two t;;
Run Code Online (Sandbox Code Playgroud)

我理解第一个:_::t意味着模式匹配任何内容并调用它t

但在

# let rec at k = function
    | [] -> None
    | h :: t -> if k = 1 then Some h else at (k-1) t;;
Run Code Online (Sandbox Code Playgroud)

我不明白什么h意思。对我来说应该是_:: t -> ...匹配任何东西并调用它t

Jef*_*eld 5

模式_ :: t并不代表你所说的。它匹配任何非空列表并调用列表的 tail t

该模式h :: t匹配任何非空列表,调用列表的头部h(一个元素,第一个元素)和列表的尾部t(第一个元素之后的零个或多个元素)。

运算符::是列表构造函数(通常称为“cons”),这就是这些模式与列表匹配的原因。

以下是::列表构造函数的示例:

# true :: [];;
- : bool list = [true]
# 1 :: [2; 3];;
- : int list = [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)

与 OCaml 中常见的情况一样,列表的模式使用与构造函数相同的语法。

# match [1;2;3] with [] -> None | h :: t -> Some (h, t);;
- : (int * int list) option = Some (1, [2; 3])
Run Code Online (Sandbox Code Playgroud)