访问Ocaml中的记录字段

时间:2016-12-03 18:11:30

标签: ocaml

问题是,我无法写 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

1 个答案:

答案 0 :(得分:2)

查看此问题的一种方法是,您无法撰写n.left.key,因为n.left可能是Leaf

如果您想保留类型定义,则必须处理LeafNode作为单独的案例:

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

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