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

时间:2017-09-26 11:38:32

标签: pointers ocaml abstract-data-type imperative

这样的事情可能吗?

大家好,

在我的课堂上,我们被告知要使用功能和命令式编程在OCaml中实现二进制搜索树。 我们正在使用Pascal进行ADT和实现,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,但我不知道如何定义我的数据结构。 非常感谢您的投入。

1 个答案:

答案 0 :(得分:1)

根据我的理解,你会有这样的类型:

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函数调整为此类型。