我有这两个功能:
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)
Run Code Online (Sandbox Code Playgroud)
在实践中,它们的行为是相同的,理论上,只要案例按顺序匹配,它们就应该是相同的。但这在 OCaml 中能得到保证吗?如果某些较新版本的编译器开始通过重新排列顺序来优化匹配语句怎么办?在这种情况下,只有第二个版本才能产生正确的结果。我应该担心这个吗?
事实上,
函数 p1 -> expr1 | 的形式为 ...| pn -> exprn
相当于
函数 expr ->将 expr 与p1 -> expr1 |匹配 ...| pn -> 表达式
上面的注释match
是这样说的;
将 expr 与 |匹配 p1 -> expr1
:
| pn -> 表达式表达式 expr 按顺序与各种模式 p1, ..., pn 匹配。
所以不,这是语言的一部分,你不需要担心。