OR模式匹配

Nic*_*ner 3 f# pattern-matching

我试图用一个或图案,如所描述这里:

let foo = function
    | Some (0, x) when x > 0 | None -> "bar"
    | _ -> "baz"
Run Code Online (Sandbox Code Playgroud)

但是,这会给编译器错误:

错误FS0010:意外的符号'|' 在模式匹配中.预期' - >'或其他令牌.

我究竟做错了什么?这与when警卫有关吗?

Dan*_*iel 7

一个when警卫指的是单个的情况下,无论有多少模式相结合.案件需要分开:

let foo = function
  | Some (0, x) when x > 0 -> "bar"
  | None -> "bar"
  | _ -> "baz"
Run Code Online (Sandbox Code Playgroud)

因此,最好将返回值分解出来,因此不会重复可能复杂的表达式:

let foo value =
  let ret = "bar"
  match value with
  | Some (0, x) when x > 0 -> ret
  | None -> ret
  | _ -> "baz"
Run Code Online (Sandbox Code Playgroud)

使用活动模式是避免这种重复的另一种方法:

let (|Bar|_|) = function
  | Some(0, x) when x > 0 -> Some()
  | None -> Some()
  | _ -> None

let foo = function
  | Bar -> "bar"
  | _ -> "baz"
Run Code Online (Sandbox Code Playgroud)