我已经定义了
type 'a tree =
| Tree of 'a tree * 'a * 'a tree
| Leaf of 'a
| Null;;
现在我必须定义一个将整个'a tree
更改为'b tree
的函数。
我在google上搜索并尝试自己解决但是我被困了。有什么提示吗?
答案 0 :(得分:9)
一种可能性是map
函数的模拟,但是在树上。例如:
let rec treemap f t = match t with
Null -> Null
| Leaf x -> Leaf (f x)
| Tree (l, x, r) -> Tree (treemap f l, f x, treemap f r)
此处t : 'a tree
,f : 'a -> 'b
和treemap : 'a tree -> ('a -> 'b) -> 'b tree
,根据需要生成'b tree
。
这是最自然的"制作这样一个函数的方法:你有一个类型为'a
的树的树,你想得到一个值为'b
的值的新树 - 所以你只需要一棵树和某种映射方式一种类型的值与另一种类型的值。
我认为值得指出的是,这不是唯一的此类功能。您可以创建一个函数treereplace : 'a tree -> 'b -> 'b tree
,它只创建一个结构相同的树,但用给定的一个替换每个值,或者一个函数执行相同但翻转每个Tree
节点的左/右分支。有无数的函数可以使用'a tree
并生成'b tree
,这可以说是最自然和最有用的。
编辑:改进/批评欢迎 - 我不了解OCaml,我通过对SML的理解一起攻击了这个例子。