2017-12-06 22 views
0

私はOCamlのBSTの基本的な操作のためにモジュール/インタフェースを作成しようとしています。 2,3,5からなるBSTツリーを得るためにモジュールを使用しているBST - OCaml

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);; 

を出力は正常です:

しかし、私が前に言ったように、私は以下のようにこれを達成したいと思います:

T.push(2);; 
T.push(3);; 
T.push(5);; 
T.postorder();; 

以下

は私の実装です(私はこれが私の後順機能にいくつかの変更を必要としますが、私は現在使用している1ので、私は私が気圧持っている木を確認することができます一時的なものであると認識)。あなたが解決策が表示された場合、私に知らせてください;)

module type Tree = 
    sig 
     type bt 
     val create: unit -> bt 
     val push: int -> bt -> bt 
     val find: int -> bt -> bool 
     val preorder: bt -> int list 
     val postorder: bt -> int list 
     val inorder: bt -> int list 
    end;; 

module T : Tree = 
    struct 
     type bt = E | B of bt * int * bt 
     let create() = E 
     let rec push x = function 
      | E -> B(E, x, E) 
      | B (l, y, r) when x<y -> B(push x l, y, r) 
      | B (l, y, r) when x>y -> B(l, y, push x r) 
      | xs -> xs;; 

     let rec find x = function 
      | E -> false 
      | B(l, y,_) when x< y -> find x l 
      | B(_,y,r) when x>y -> find x r 
      | _ -> true;; 

     let rec preorder = function 
      | B(l,v,r) -> v::(preorder r) @ (preorder l) 
      | E -> [];; 

     let rec inorder = function 
      | B(l,v,r) ->(inorder r) @ v::(inorder l) 
      | E -> [] 


     let rec postorder = function 
      | B(l,v,r) -> (postorder r) @ (postorder l) @ [v] 
      | E -> [] 
    end;; 

答えて

1

あなたはモジュールのクラスにしたいようだが、私はより多くの慣用的な解決策を検討するために、あなたをお勧めします。パイプオペレータの使用を検討しましたか?

T.create() 
|> T.push(2) 
|> T.push(3) 
|> T.push(5) 
|> T.postorder;; 

または(あなただけTもちろんのより長い名前のモジュールを持っている場合は、より理にかなって)ローカルオープンであなたも、あなたが求めているもの

T.(
    create() 
    |> push(2) 
    |> push(3) 
    |> push(5) 
    |> postorder 
); 

を行うことができます必要になりますグローバルな可変状態を導入します。これは、単に「変化」ではなく、まったく異なるパラダイムです。それは、いつでもどこからでも変わる可能性のある状態に依存するため、コードを予測できず、デバッグするのが困難になるためです。

OCamlにもクラスがあるので、クラスを実際に使用することもできます。それからあなたはまだ可変状態を持っていますが、それは少なくとも含まれています。

+0

ありがとうございました!パイプオペレータは私が探していたものでした。しかし、今私はポストオーダー機能に問題があります。この関数を "unit-> int list"にすることは可能ですか? "bt - > int list"、私は使えないという方法を見つけるように思えるので、> T.postorder () – hdw3

+1

使用している関数のアプリケーション構文が誤解を招くことがあります。 OCamlは関数アプリケーションに括弧を使いません。なぜなら、単一の引数で動作する理由はまったく偶然でしかありません。適切な構文は 'T.create()|> T.push 2 |> T.postorder'です。単一の引数を括弧で囲んで、関数と括弧で囲まれた引数の間の空白を削除することもできますが、混乱する以外の目的はありません。 – glennsl

関連する問題