首页 > 解决方案 > 在 OCaml 中对模式匹配不做任何事情

问题描述

当我在 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

那么我怎么能在模式案例上告诉“什么都不做”呢?

谢谢 !

标签: ocaml

解决方案


你需要问自己:在第三种情况下,你怎么知道第一次递归找到了结果?您如何将此与不成功的递归区分开来,在这两种情况下您会做什么?另外,如果整棵树中没有符合您标准的节点怎么办?

所以“什么都不做”不是你想要的,你需要以某种方式表明什么也没找到。

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

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当没有找到节点时。


推荐阅读