私は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;;
ありがとうございました!パイプオペレータは私が探していたものでした。しかし、今私はポストオーダー機能に問題があります。この関数を "unit-> int list"にすることは可能ですか? "bt - > int list"、私は使えないという方法を見つけるように思えるので、> T.postorder () – hdw3
使用している関数のアプリケーション構文が誤解を招くことがあります。 OCamlは関数アプリケーションに括弧を使いません。なぜなら、単一の引数で動作する理由はまったく偶然でしかありません。適切な構文は 'T.create()|> T.push 2 |> T.postorder'です。単一の引数を括弧で囲んで、関数と括弧で囲まれた引数の間の空白を削除することもできますが、混乱する以外の目的はありません。 – glennsl