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警卫有关吗?
一个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)