问题是,我无法写 n.key> = n.left.key&& n.key< compare_children 函数中的n.right.key ;
我想在OOP node.left.right.left ...
中编写它我真的想了解更多关于镜片的内容,但我还没有在网上找到任何材料。
type avl_tree =
Node of avl_tree_node
| Leaf
and avl_tree_node = {
key : int;
balance : int;
left : avl_tree;
right : avl_tree;
}
type subtree_lens = {
get : avl_tree_node -> avl_tree;
set : avl_tree_node -> avl_tree -> avl_tree_node
}
let lens_right = {
get = (fun node -> node.right);
set = fun node t -> {node with right = t}
}
let lens_left = {
get = (fun node -> node.left);
set = fun node t -> {node with left = t}
}
let compare_children nd =
match nd with
| Leaf -> true
| Node n -> n.key >= n.left.key && n.key < n.right.key
答案 0 :(得分:2)
查看此问题的一种方法是,您无法撰写n.left.key
,因为n.left
可能是Leaf
。
如果您想保留类型定义,则必须处理Leaf
和Node
作为单独的案例:
let compare_children nd =
match nd with
| Leaf -> true
| Node { left = Leaf } -> (* Leaf case, fill in... *) false
| Node { right = Leaf } -> (* Other leaf case, fill in... *) false
| Node { left = Node ln; right = Node rn; key = k } ->
k >= ln.key && k < rn.key
<强>更新强>
OCaml表达式如下所示:{ x with f = v }
。表达式x
的类型必须是包含名为f
的字段的记录类型。表达式求值为一个记录,其字段与x
的字段相同,只是f
字段的值为v
。实际上,您可以在with
之后拥有任意数量的字段。
要访问nd
字段,您可以使模式更明确:
let compare_children nd =
match nd with
| Leaf -> true
| Node { left = Leaf; right = Leaf } -> true
| Node { left = Leaf; right = Node rn; key = k } -> k < rn.key
| Node { left = Node ln; right = Leaf; key = k } -> k >= ln.key
| Node { left = Node ln; right = Node rn; key = k } ->
k >= ln.key && k < rn.key
请注意,我只是猜测函数应该返回什么。这只是您可能想要使用的模式的一个示例。