OCaml 模式匹配一条语句中的记录和字段
OCaml pattern match record and fields in one statement
我想要一个匹配语句让我访问记录 和 它的一些字段,如下所示:
| Some n {left = Some l; right = Some r} -> dostuff...
所以在这里,我可以参考记录 (n
) 及其左侧 l
和右侧 r
的字段。这可能吗?
例如我想要这样的东西
let rec remove_node root v =
match root with
| None -> root
| Some n when v > n.value -> do_a...
| Some n when v < n.value -> do_b...
| Some n when {left = Some l; right = Some r} -> do_c...
| Some {right = Some r} -> do_d...
| Some {left} -> do_e...
但是我现在正在写这个:
let rec remove_node root v =
match root with
| None -> root
| Some n ->
(match n with
| _ when v > n.value -> do_a...
| _ when v < n.value -> do_b...
| {left = Some l; right = Some r} -> do_c...
| {right = Some r} -> do_d...
| {left} -> do_e...
)
还不错,但我想尽可能避免嵌套匹配。
正如 Lee 在上面的评论中指出的那样,解决方案是在括号中使用 as
,如下所示:
let rec remove_node root v =
match root with
| Some ({left = Some l; right = Some r} as n) -> dostuff...
(@Lee,如果你想回答,那么我可以给你点赞,我会删除这个并投票给你的答案。)
我想要一个匹配语句让我访问记录 和 它的一些字段,如下所示:
| Some n {left = Some l; right = Some r} -> dostuff...
所以在这里,我可以参考记录 (n
) 及其左侧 l
和右侧 r
的字段。这可能吗?
例如我想要这样的东西
let rec remove_node root v =
match root with
| None -> root
| Some n when v > n.value -> do_a...
| Some n when v < n.value -> do_b...
| Some n when {left = Some l; right = Some r} -> do_c...
| Some {right = Some r} -> do_d...
| Some {left} -> do_e...
但是我现在正在写这个:
let rec remove_node root v =
match root with
| None -> root
| Some n ->
(match n with
| _ when v > n.value -> do_a...
| _ when v < n.value -> do_b...
| {left = Some l; right = Some r} -> do_c...
| {right = Some r} -> do_d...
| {left} -> do_e...
)
还不错,但我想尽可能避免嵌套匹配。
正如 Lee 在上面的评论中指出的那样,解决方案是在括号中使用 as
,如下所示:
let rec remove_node root v =
match root with
| Some ({left = Some l; right = Some r} as n) -> dostuff...
(@Lee,如果你想回答,那么我可以给你点赞,我会删除这个并投票给你的答案。)