哪里可以找到OCaml索引参考?

时间:2013-01-21 22:23:32

标签: pattern-matching ocaml manual

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

1 个答案:

答案 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}}分别分配给非空列表的头部和尾部。