【问题标题】:Pointer to a record in OCaml指向 OCaml 中记录的指针
【发布时间】:2023-04-01 21:11:01
【问题描述】:

我正在 OCaml 中实现二叉搜索树,尝试使用尽可能多的命令式编程。

我有以下数据类型:

type tKey = Key of int;;

type tBST = Null | Pos of node ref
            and node = {mutable key : tKey; mutable left : tBST; mutable right : tBST};;

我在使用此功能时遇到问题:

let createNode k tree = 
    tree := Pos ({key = k; left = Null; right = Null});;

Error: This record expression is expected to have type node ref
       The field key does not belong to type ref

二叉搜索树可以是 Null(表示空树)或 Pos。树 Pos 是指向节点的指针,节点是键和其他 2 棵树(左和右)的结构。

我的主要目标是在函数结束后修改一棵树。通过引用传递树,所以当 createNode 结束时,我作为参数传递的 tBST 被修改。

问题:实际上可以在 OCaml 中做我正在尝试的事情吗?如果是这样,我怎么能改变我的函数 createNode 和/或数据类型来实现这一点?

非常感谢。

【问题讨论】:

    标签: pointers ocaml binary-search-tree record imperative-programming


    【解决方案1】:

    这是可能的,但您需要使用显式引用创建Pos 节点:

    Pos (ref {key = k; (*...*)})
    

    不过,您尝试做的是否是推荐使用 Ocaml 等语言练习则是另一回事。

    【讨论】:

    • 非常感谢。确切地说,我很清楚使用我已经实现的递归和纯代码会更容易。谢谢!!
    【解决方案2】:

    问题已经回答了。我想补充一点:在这种情况下,ref 的使用似乎是多余的。

    tBST 类型的值要么是 Null,要么是可变指针。如果是Null,它将保持Null。如果它不是Null,它将保持非Null,但实际指针可能会改变。这很可能是你的意图,但我有我的怀疑。特别是,tBST 没有做的是模拟 C 风格的指针(它们要么是 null 要么真的指向某个地方)。不过,我怀疑那是你的意图。

    模拟 C 风格指针的惯用方法是只使用内置的 option 类型,如下所示:

    type tBST = node option
    

    node option 类型的值是NoneSome n,其中n 是指向node 类型值的指针。您将tBST 用于可变字段(记录node),因此您将有效地拥有指向节点的可变C 样式指针。

    【讨论】:

    • 嗯,非常感谢您提供的信息 kne,以前从未听说过。对于 Null 案例,这将更有意义。但是,我不仅想模拟 C 风格的指针,还想拥有真正的功能
    【解决方案3】:

    以下是您可能想到的:

    type tree = node option ref
    and node  = {
      mutable left: tree;
      mutable key: int;
      mutable right: tree;
    };;
    
    let t0 : tree = ref None;;
    let t1 : tree = ref (Some { left = ref None; key = 1; right = ref None; }) ;;
    
    let create_node key tree = 
      tree := Some { left = ref None; key; right = ref None; }
    

    key 不需要单独的类型,但你可以根据需要使用它,并且使用最新的 OCaml,它没有运行时开销。

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      相关资源
      最近更新 更多