Module 使用模块的BST-OCaml

Module 使用模块的BST-OCaml,module,ocaml,binary-search-tree,Module,Ocaml,Binary Search Tree,我正在尝试在OCaml中为BST上的基本操作创建模块/接口(我不知道它是如何调用的,我对该语言不熟悉)。我的目标是有一个实现,让我可以做这样的事情: T.create();; T.push(2);; T.push(3);; T.push(5);; let teeBst = T.push(2)(T.push(3)(T.push(5)(T.create())));; 为了得到由2,3,5组成的bst树 但为了实现这一点,我必须这样写: T.create();; T.push(2);; T.pu

我正在尝试在OCaml中为BST上的基本操作创建模块/接口(我不知道它是如何调用的,我对该语言不熟悉)。我的目标是有一个实现,让我可以做这样的事情:

T.create();;
T.push(2);;
T.push(3);;
T.push(5);;
 let teeBst = T.push(2)(T.push(3)(T.push(5)(T.create())));;
为了得到由2,3,5组成的bst树

但为了实现这一点,我必须这样写:

T.create();;
T.push(2);;
T.push(3);;
T.push(5);;
 let teeBst = T.push(2)(T.push(3)(T.push(5)(T.create())));;
因此,当我检查/使用代码时,我必须这样做:

    let tee2 = T.push(2)(T.push(3)(T.push(5)(T.create())));;
    T.postorder(tee2);;
输出良好:

 # val tee2 : T.bt = <abstr>
 # - : int list = [2; 3; 5]
(我意识到这需要对我的postorder函数进行一些更改,但我当前使用的是一个临时函数,因此我可以检查我拥有的树)

下面是我的实现。如果您看到解决方案,请让我知道;)

模块类型树=
信号
bt型
val创建:单元->bt
val推送:int->bt->bt
val查找:int->bt->bool
val预订单:bt->int列表
val后订单:bt->int列表
val顺序:bt->int列表
终止
模块T:树=
结构
类型bt=bt*int*bt的E | B
让create()=E
让rec推x=函数
|E->B(E,x,E)
|当x B(推动x l,y,r)时的B(l,y,r)
|当x>y->B(l,y,推x-r)时B(l,y,r)
|xs->xs;;
让rec找到x=函数
|E->false
|B(l,y,u)当x查找x l
|当x>y->find xr时的B(u,y,r)
|是的;;
设rec preorder=函数
|B(l,v,r)->v::(前序r)@(前序l)
|E->[];;
设rec inorder=函数
|B(l,v,r)->(顺序r)@v::(顺序l)
|E->[]
让rec postorder=函数
|B(l,v,r)->(后序r)@(后序l)@[v]
|E->[]
终止

> 看起来你想让模块成为类,但是我建议你考虑更多的惯用解决方案。你考虑过使用管道操作员吗

T.create()
|> T.push(2)
|> T.push(3)
|> T.push(5)
|> T.postorder;;
或者使用local open(如果您的模块名称比
T
长,这会更有意义),您甚至可以这样做

T.(
  create()
  |> push(2)
  |> push(3)
  |> push(5)
  |> postorder
);
你所要求的将需要引入全局可变状态,这不仅仅是“一些变化”,而是一个完全不同的范式。这是一个普遍不受欢迎的问题,因为它使您的代码变得不可预测且难以调试,因为它依赖于可能随时从任何地方更改的状态


另一种可能是实际使用类,因为OCaml也有这些类。然后,您仍然拥有可变状态,但它至少会被包含。

谢谢!管道操作员是我要找的人。但现在我对后序函数有问题。有没有可能将此函数改为“unit->int list”而不是我现在的“bt->int list”,因为我似乎找不到一种方法,这意味着我不能使用|>t.postorder()。您使用的函数应用程序语法有误导性。OCaml在函数应用程序中不使用括号,它与单个参数一起工作的原因纯粹是偶然的。正确的语法是
T.create()|>T.push 2 |>T.postorder
。您可以将单个Arumgin括在括号中,并删除函数和括号内参数之间的空格,但它的作用只是混淆。