OCaml 中的 h::t 模式匹配是什么意思?

What does the h :: t pattern matching means in OCaml?

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

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

我理解第一个:_::t 表示模式匹配任何东西并称之为 t

但是在

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

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

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

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

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

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

# true :: [];;
- : bool list = [true]
# 1 :: [2; 3];;
- : int list = [1; 2; 3]

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

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

h::t 模式将列表的头部和尾部与变量 ht 匹配。 所以如果我这样进行模式匹配:

match [1; 2; 3] with
| h::t -> (* Some code... *)

h 的值为 1t 的值为 [2; 3]

:: 是一个 构造函数 。这种时尚模式中的模式匹配与构造函数相匹配。他们用两个值创建了一个新的数据类型。 :: 是构造函数,其类型 list 是递归的。下面是 list 类型的示例定义:

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

;;

因此 list 类型是递归的,因为它的构造函数 :: 会调用自身。

老实说,关于清单我可以写半本书。它们是函数式编程语言的基础。

如果您想知道为什么不能在 运算符 上进行模式匹配,这就是原因。您不能对运算符进行模式匹配,只能对构造函数进行模式匹配。

是的,确实当您输入一个函数时,让我们以这个函数为例:

let is_empty (l: int list) : int =
  begin match l with
    | [] -> 1
    | h::t -> 0
  end;;

因此,在这个测试列表是否为空的函数中,如果 [],一个空列表它 returns 一个或布尔值 true 但如果 h::t,意思有一个或多个值,函数 returns 0,表示它为假。