4

我有这两个功能:

let print_length = function
    | [] -> Printf.printf "The list is empty"
    | xs -> Printf.printf "The list has %d elements" (List.length xs)

let print_length = function
    | [] -> Printf.printf "The list is empty"
    | (_ :: _) as xs -> Printf.printf "The list has %d elements" (List.length xs)

在实践中,它们的行为是相同的,理论上它们应该是相同的,只要案例按顺序匹配即可。但这在 OCaml 中有保证吗?如果一些较新版本的编译器开始通过重新排列顺序来优化匹配语句怎么办?在这种情况下,只有第二个版本会产生正确的结果。我应该担心这个吗?

4

2 回答 2

4

来自使用 Objective Caml 开发应用程序

实际上形式
函数 p1 -> expr1 | ...| pn -> exprn
等价于
函数 expr ->将 expr 与p1 匹配 -> expr1 | ...| pn -> 表达式

上面的注释是match这样说的;

将 expr 与 |匹配 p1-> expr1

| pn -> 表达式

表达式 expr 按顺序匹配各种模式 p1, ..., pn。

所以不,这是语言的一部分,你不必担心。

于 2013-04-30T18:14:41.063 回答
2

是的,顺序不会改变。

如果没有定义顺序,许多可能的模式根本不起作用——任何后来的情况比早期的情况更普遍的模式都会破坏。以我的经验,相当多的模式采用这种形式。优化器根本无法做到这一点,因为大量代码会以非常微妙的方式破坏。

手册明确指出了这一点:

如果多个模式与 expr 的值匹配,则选择匹配表达式中第一个出现的模式。

于 2013-04-30T18:12:36.920 回答