1

我想从下面引用的书中理解一个例子。我知道这是关于模式匹配的事情,但是我在哪里可以找到关于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
# ;;
4

1 回答 1

3

OCaml 手册中的此页面解释了如何match工作:

表达方式

match expr 
with  pattern1    ->  expr1 
| … 
| patternn    ->  exprn

将 expr 的值与模式 pattern1 匹配到 patternn。如果与 patterni 的匹配成功,则评估关联的表达式 expri,其值成为整个 match 表达式的值。expri 的评估发生在由匹配期间执行的绑定丰富的环境中。如果多个模式与 expr 的值匹配,则选择匹配表达式中第一个出现的模式。如果没有任何模式与 expr 的值匹配,则会引发异常 Match_failure。

也就是说,它会一个接一个地尝试一个模式,直到找到一个匹配的模式。一旦完成,它就会返回与该模式关联的表达式(即 右侧的表达式->)。如果没有模式匹配,你会得到一个异常。

手册的这一页解释了存在哪些类型的模式以及它们的含义。不过这有点多,所以这里是相关位的摘要:

最重要的模式是可变模式和变体模式:

变量模式只是一个变量名。此模式始终匹配并允许您通过 . 右侧的给定名称引用匹配的表达式->。您也可以使用 代替名称_,它也始终匹配,但不允许您引用 . 右侧的值->

变体模式是变体类型的构造函数的名称,后跟构造函数接受参数的多个模式。如果您要匹配的值使用该特定构造函数并且该值内的每个元素都匹配相应的模式,则此模式匹配。

在您的示例中,第一个模式是[]. 这是list表示空列表的类型的构造函数。构造[]函数不接受任何参数。因此,如果列表为空,则此模式匹配。

第二种模式是head :: tail。是表示非空列表::的类型的构造函数。list构造::函数有两个参数:列表的头部和列表的尾部。head并且tail是与构造函数的这两个参数匹配的变量模式::。因此,如果列表非空,则此模式匹配,并将变量head和分配给tail非空列表的头部和尾部。

于 2013-01-21T22:48:34.083 回答