com*_*y24 3 ocaml pattern-matching
从性能的角度来看,我想知道匹配的模式顺序是否影响函数的效率,或者它更多地与预期的不同匹配的比例有关(即,如果一个模式发生的方式比其他模式更多,它应该更早出现).
(* a function to return the smaller of two int options, or None if both are None. If exactly one argument is None, return the other. *)
let min_option (x: int option) (y: int option) : int option =
match x, y with
None, None -> None
| Some x, None -> Some x
| None, Some y -> Some y
| Some x, Some y -> if x < y then Some x else Some y
let () = assert((min_option (Some 10) (Some 11)) = Some 10);;
Run Code Online (Sandbox Code Playgroud)
OCaml中的模式匹配算法非常聪明,因此您无需担心匹配顺序.如果您对某个主题感兴趣,请从此stackoverflow帖子开始阅读.
上述规则有一些例外:首先,你的函数的语义可能取决于匹配的顺序,如果它们重叠; 第二,如果您对数据(如字符串或整数)进行模式匹配,那么它将被编译为有些类似于if/else系列,并进行一些优化.
最后问起原来的问题,我不知道如何以有效的方式编写模式匹配的最佳实践.
为了以防万一,我显然认为所提供的示例是合成的,但对于那些将来会阅读我们的人.你根本不需要编写这个函数,因为普遍的min多态函数已经在选项上有了预期的行为.所以你的功能完全一样(语义上)min x y.但是,如果您真的对优化感兴趣,例如,如果您在紧密循环中使用它,那么您可以像这样重写它:
let min x y : int option =
match x, y with
| v, None | None, v -> v
| Some p, Some q -> if p < q then x else y
Run Code Online (Sandbox Code Playgroud)
这将产生一个有效的代码,它不会执行对多态比较函数的C调用,也不会执行任何分配.但是和往常一样,你应该追踪你的程序来弄清楚,这个功能确实是一个瓶颈.