匹配案例是否保证按声明顺序进行测试?

时间:2013-04-30 18:04:40

标签: ocaml

我有这两个功能:

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中得到保证?如果某个较新版本的编译器通过重新排列顺序开始优化匹配语句会怎么样?在这种情况下,只有第二个版本会产生正确的结果。我应该担心这个吗?

2 个答案:

答案 0 :(得分:4)

来自Developing Applications with Objective Caml;

  

实际上形式为   函数p1 - > expr1 | ... | pn - > exprn
  相当于
  function expr - > 匹配expr p1 - > expr1 | ... | pn - > exprn

并且match上的注释可以这样说;

  

将expr与匹配   | p1 - >表达式1
  :
  | pn - > exprn

     

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

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

答案 1 :(得分:2)

是的,订单不会改变。

如果未定义订单,许多可能的模式根本不起作用 - 任何后一种情况比早期情况更普遍的模式都会破坏。根据我的经验,这种形式有很多模式。优化器根本无法做到这一点,因为巨大的代码段会以非常微妙的方式破坏。

manual明确指出:

  

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