带有指针的命令式 OCaml 数据结构?

Imperative OCaml data structure with pointers?

这样的事情可能吗?

大家好,

在我的 class 中,我们被告知要使用函数式和命令式编程在 OCaml 中实现二叉搜索树。 我们正在关注 ADT 和 Pascal 中的实现,Pascal 是一种使用指针的过程语言。

数据结构如下所示:

# Pascal
type
   tKey      = integer;
   tPos      = ^tNode;
   tNode     = record
          key         : tKey;
          left, right : tPos;
           end;      
   tBST = tPosT;

我们还学习了一些基本的 BST 操作。这是其中的一个例子,如果这对您有帮助的话:

# Pascal
procedure add_key(VAR T : tBST; k:tKey);
var new, parent, child :  tBST;
begin
   createNode(new);
   new^.key := k;
   new^.left := nil;
   new^.right := nil;

   if T=nil then
      T := new
   else begin
      parent := nil;
      child := T;
      while (child <> nil) and (child^.key <> k) do begin
     parent := child;
     if k < child^.key then
        child := child^.left
     else
        child := child^.right;
      end;

      if (child = nil) then 
     if k < parent^.key then
        parent^.left := new
     else
        parent^.right := new;
        { duplicates are ignored }
   end;
end;

这就是我的功能(如果有意义的话)数据结构的样子:

type key =
    Key of int;;

type bst = 
    Empty   
    | Node of (key * bst * bst);;

但是,我在使用 OCaml 的命令式方面遇到了很大的麻烦。我必须让它看起来尽可能与 Pascal 实现相似,而且我不知道 OCaml 中数据结构和指针的可能性,因为我一直使用递归等进行编程。我正在考虑使用多个 "let"、if 和 else,但我不知道如何定义我的数据结构。 将不胜感激。

据我了解,您的类型应该是这样的:

type key = int

type t = Empty | Node of t * key * t

但是你的添加函数不应该是这样的:

let rec add x t =
  match t with
    | Empty ->
      Node (Empty, x, Empty)
    | Node (l, v, r) ->
      let c = compare x v in
      if c = 0 then t
      else if c < 0 then Node (add x l, v, r)
      else Node (l, v, add x r)

因为这只是功能性的。

也许您可以将类型更改为:

type t = Empty | Node of t ref * key * t ref

并尝试使 add 函数适应这种类型。