我希望从下面引用的书中找到一个例子。我知道这是关于模式匹配的,但我在哪里可以找到match
表达式的完整和准确的描述?
# let rec sort lst =
# match lst with
# [] -> []
# | head :: tail -> insert head (sort tail)
# and insert elt lst =
# match lst with
# [] -> [elt]
# | head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail
# ;;
答案 0 :(得分:3)
This page in the OCaml manual解释match
如何运作:
表达式
match expr with pattern1 -> expr1 | … | patternn -> exprn
将expr的值与pattern1到patternn的模式匹配。 如果与patterni的匹配成功,则关联表达式 expri被评估,其值变为整个匹配的值 表达。 expri的评估发生在一个环境中 通过匹配期间执行的绑定来丰富。如果好几个 模式匹配expr的值,这是在第一个出现的值 匹配表达式被选中。如果所有模式都不匹配该值 of expr,引发了Match_failure异常。
也就是说,它会一个接一个地尝试一个模式,直到找到匹配的模式。一旦它发生,它返回与该模式相关联的表达式(即->
右侧的表达式)。如果没有模式匹配,则会出现异常。
this page of the manual解释了哪种模式及其含义。这有点多,所以这里是相关位的摘要:
最重要的模式是变量模式和变体模式:
变量模式只是一个变量名。此模式始终匹配,并允许您通过->
右侧的给定名称引用匹配的表达式。您也可以使用_
代替名称,->
也始终匹配,但不允许您引用[]
右侧的值。
变体模式是变体类型的构造函数的名称,后跟构造函数接受参数的模式。如果您匹配的值正在使用该特定构造函数,并且该值内的每个元素与相应的模式匹配,则此模式匹配。
在您的示例中,第一个模式是list
。这是表示空列表的[]
类型的构造函数。 head :: tail
构造函数不带参数。因此,如果列表为空,则此模式匹配。
第二种模式是::
。 list
是::
类型的构造函数,表示非空列表。 head
构造函数有两个参数:列表的头部和列表的尾部。 tail
和::
是与head
构造函数的两个参数匹配的变量模式。因此,如果列表非空,则此模式匹配,并将变量tail
和{{1}}分别分配给非空列表的头部和尾部。