OCaml模式顺序与最佳实践相匹配

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)

ivg*_*ivg 6

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调用,也不会执行任何分配.但是和往常一样,你应该追踪你的程序来弄清楚,这个功能确实是一个瓶颈.