对OCaml中的模式匹配不执行任何操作

1597846254899

当我在OCaml的树上对函数进行编程时,我总是会遇到这个反复出现的问题:当我到达树的叶子时,我什么也不愿返回,但仍然希望我的程序继续进行。

更清楚地说,有时我有一些练习要求找到一个特定的节点n,所以我可以执行以下操作:(为简单起见,我在这里在二叉树上执行此操作):

let rec find_node n tree = match tree with 
|Nil   ->  (* I don't want my program to stop here but then what can I return ?*) 
|Node(l, k, r) as t when k =n -> t
|Node(l, _, r) -> find_node n l; find_node n r

我正在使用二进制树的以下表示形式:

type b_tree = Nil | Node of b_tree * int * b_tree 

因此,基本上我希望我的程序继续运行,直到找到所需的内容为止,但是由于OCaml中的一个函数只有一个返回类型,因此我无法执行以下操作:

let rec find_node n tree = match tree with 
|Nil   ->  ()  (*returning unit type here*)
|Node(l, k, r) as t when k =n -> t
|Node(l, _, r) -> find_node n l; find_node n r

那么,如何识别模式案例中的“不执行任何操作”?

谢谢 !

安德烈亚斯·罗斯伯格(Andreas Rossberg)

您需要问自己:在第三种情况下,您如何知道第一次递归找到了结果?您如何将其与不成功的递归区分开来?在两种情况下该怎么办?另外,如果整个树中没有满足您条件的节点怎么办?

因此,“不执行任何操作”不是您想要的,您需要以某种方式表明什么也没找到。

解决所有这些问题的一种显而易见的方法是返回一个选项,这将产生以下代码:

let rec find_node n tree =
  match tree with 
  | Nil -> None
  | Node ((_, k, _) as t) when k = n -> Some t
  | Node (l, _, r) ->
    match find_node n l with
    | None -> find_node n r
    | some -> some

返回类型为(b_tree * int * b_tree) option,描述节点属性,或者为None未找到节点时的返回类型

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章