2016-04-29 19 views
1

小さい値を挿入したいとします。それは行くだろうNode (insert x left, k, right) 私はinsert x leftを持つことができる方法を理解していない機能の挿入が1つの引数、キーを取ると宣言されている。どのように左にも挿入機能に渡すことができますか?OCamlのバイナリ検索ツリー挿入関数

type 'a bst_t = 
| Leaf 
| Node of 'a bst_t * 'a * 'a bst_t 

let rec insert x = function 
    | Leaf -> Node (Leaf, x, Leaf) 
    | Node (left, k, right) -> 
    if x < k then Node (insert x left, k, right) 
    else Node (left, k, insert x right) 

答えて

0

functionキーワードは、一連のパターンとしての機能を定義し、ほとんど常にようなパラメータに名前を与えることなく使用されます。したがって、実際にはinsert関数には2つのパラメータがあります。 functionなし

この定義は同等です:

let rec insert x node = 
    match node with 
    | Leaf -> Node (Leaf, x, Leaf) 
    | Node (left, k, right) -> 
    if x < k then Node (insert x left, k, right) 
    else Node (left, k, insert x right) 
+0

これは、実際には任意の数の引数を渡すことができますか? –

+1

いいえ、関数は2つの引数を正確にとります。 (同等のフォームを見て、引数は明示的です。) –

+0

_パラメータには名前は付けません。おそらく初心者の方にしたいと思うかもしれませんが、これは痛いものです。等号の左にあるパターンマッチングについて話したくない場合は、「単一のパラメータを指定するか、パターンマッチングを開始する」と言うでしょう。 –

0

それは一見そう見えるかもしれないが、機能insertは一つではなく二つの引数を持っている - 一つは、あなたが言ったように挿入されるキー、および第二です1つは、キーを挿入するbst_tです。

OCamlでは、それが適用可能な場合はPoint-free programmingのコンセプトが強く推奨されています。それはまさにあなたの挿入機能で起こることです。あなたの関数のバージョンは(通常、冗長な構文で記述された)次の関数のためだけの短手表記です:

BSTは挿入がその関数ツリー、つまり、実行されている木である
let rec insert x bst = match bst with 
| Leaf -> Node (Leaf, x, Leaf) 
| Node (left, k, right) -> 
    if x < k then Node (insert x left, k, right) 
    else Node (left, k, insert x right) 

パターンはLeaf | Nodeと一致します。

1

Ocam1はREPL、すなわち実験に有用な対話的環境を有し、はocamlと対話する。

$ ocaml 
     OCaml version 4.02.3 

# type 'a bst_t = 
| Leaf 
| Node of 'a bst_t * 'a * 'a bst_t ;; 
type 'a bst_t = Leaf | Node of 'a bst_t * 'a * 'a bst_t 
# let rec insert x = function 
    | Leaf -> Node (Leaf, x, Leaf) 
    | Node (left, k, right) -> 
    if x < k then Node (insert x left, k, right) 
    else Node (left, k, insert x right)   ;; 
val insert : 'a -> 'a bst_t -> 'a bst_t = <fun> 

read-eval-print-loopには、評価式の値だけでなくそのタイプも表示されます。ここでは、シンボルinsertは "some type 'a"の値をとり、 "そのタイプのバイナリツリー'a"の値をとり、同じバイナリの値を返す関数にバインドされていることがわかります'aタイプの木。

システムについて多くのことを教えてくれるたびに、REPLを使用することを強く推奨します。

+0

['utop'](https://github.com/diml/utop)をREPLとして使うことをお勧めします。 [OPAM](https://opam.ocaml.org): 'opam install utop'の助けを借りて簡単にインストールできます。または、少なくとも 'ocaml'を[' rlwrap'](https://github.com/hanslub42/rlwrap)や['ledit'](http://pauillac.inria.fr/~ddr/ledit/ )(詳細とヒントはこちら[こちら](http://mirror.ocamlcore.org/wiki.cocan.org/tips_for_using_the_ocaml_toplevel.html))。 –