访问Ocaml中的记录字段

访问Ocaml中的记录字段,ocaml,Ocaml,问题是,我无法在compare\u children函数中写入n.key>=n.left.key和&n.keyavl_树; 设置:avl_树节点->avl_树->avl_树节点 } 让镜头向右={ get=(乐趣节点->节点.右); set=fun节点t->{node with right=t} } 让镜头_向左={ get=(乐趣节点->节点.左); set=fun节点t->{node with left=t} } 让我们把你的孩子和你的孩子比较一下= 匹配 |叶->真 |节点n->n.key

问题是,我无法在compare\u children函数中写入n.key>=n.left.key和&n.key

我想在OOP节点中编写它。左。右。左

我真的很想读更多关于镜头的内容,但我还没有在网上找到任何资料

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
类型avl_树=
avl_树的节点
|叶子
和avl_树_节点={
关键词:int;
余额:int;
左:avl_树;
右:avl_树;
}
类型子树_透镜={
获取:avl_树节点->avl_树;
设置:avl_树节点->avl_树->avl_树节点
}
让镜头向右={
get=(乐趣节点->节点.右);
set=fun节点t->{node with right=t}
}
让镜头_向左={
get=(乐趣节点->节点.左);
set=fun节点t->{node with left=t}
}
让我们把你的孩子和你的孩子比较一下=
匹配
|叶->真
|节点n->n.key>=n.left.key&&n.key
一种看待这一点的方法是,你不能写
n.left.key
,因为
n.left
可能是一个
叶子

如果要保留类型定义,必须将
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

注意,我只是猜测函数应该返回什么。这只是你可能想要使用的模式的一个例子。

谢谢@Jeffrey Scofield,通过lens_right函数的这行代码,还有一个问题:set=fun node t->{node with right=t}它将一个节点作为参数,然后创建一个全新的节点,其右属性设置为t?行:{124; node{left=Leaf}告诉我nd是否键入了一个avl_树,其左子树是叶子,但我不能在这里访问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