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
模式将列表的头部和尾部与变量 h
和 t
匹配。
所以如果我这样进行模式匹配:
match [1; 2; 3] with
| h::t -> (* Some code... *)
h
的值为 1
,t
的值为 [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,表示它为假。
我正在阅读 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
模式将列表的头部和尾部与变量 h
和 t
匹配。
所以如果我这样进行模式匹配:
match [1; 2; 3] with
| h::t -> (* Some code... *)
h
的值为 1
,t
的值为 [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,表示它为假。