ocaml - 在 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
那么我怎么能在模式案例上告诉“什么都不做”呢?
谢谢 !
解决方案
你需要问自己:在第三种情况下,你怎么知道第一次递归找到了结果?您如何将此与不成功的递归区分开来,在这两种情况下您会做什么?另外,如果整棵树中没有符合您标准的节点怎么办?
所以“什么都不做”不是你想要的,你需要以某种方式表明什么也没找到。
解决所有这些问题的一种明显方法是返回一个选项,该选项将产生以下代码:
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
当没有找到节点时。
推荐阅读
- c - 释放内存时,不同的图像文件大小会导致分段错误
- reactjs - 在不同的媒体查询中删除或更改 onClick
- android - android studio 不生成styles.xml 文件?主题模块在值模块内
- python - 为两件事运行令牌
- rust - 在哈希表中查找项,其中键是包含不可复制类型的元组
- graphql - PostGraphile 订阅 - “主题”指的是什么?
- kubernetes - Kubernetes 能否像计算场一样工作并为每个 pod 路由一个请求
- javascript - React Project 中的数据未呈现到屏幕上
- python - 在 IF 语句中调用 def: 函数
- firebase - 如何解决 cloud_firestore 依赖错误?