4

私はOCamlでトライを構築しようとしています:

type ('a, 'b) trie = Nil | Cons of 'a * 'b option * ('a, 'b) trie list;;

(* find place to insert key in a list of tries *)
let rec findInsert key x  =
    match x with
    [] -> Nil
    | x::xs -> let Cons(k, _, _) = x in 
        if key = k then x else findInsert key xs;;

(* inser pair in a trie *)
let rec insert ( key, value ) trie =
    match trie with
    Nil -> Cons(key, value, [])
    | t -> let Cons(k, v, trieList) = t and
        subTree = insert (key, value) (findInsert key trieList) and
        newSubTree = subTree::trieList in
        Cons(k, v, newSubTree);;

しかし、これにより次のエラーが発生します。

val findInsert : 'a -> ('a, 'b) trie list -> ('a, 'b) trie = <fun>
File "trie.ml", line 15, characters 54-62:
Error: Unbound value trieList

編集::Virgileのおかげで、コンパイルするプログラムができました:

(* insert pair in a trie *)
let rec insert ( key, value ) trie =
    match trie with
    Nil -> Cons(key, value, [])
    | t -> 
        let Cons(k, v, trieList) = t in
            let subTree = insert (key, value) (findInsert key trieList) in
            Cons(k, v, subTree::trieList);;

しかし、実行しようとすると、次のようになります。

# let t  = Cons(3, Some 4, []);;
val t : (int, int) trie = Cons (3, Some 4, [])
# insert (4, Some 5) t;;
Error: This expression has type (int, int) trie/1017
   but an expression was expected of type (int, int) trie/1260

それらの数字は何を表していますか?

4

2 に答える 2

6

一意にバインドされたすべての識別子が同時に定義されることになっているため、 let x = ... and y = ... inwhen ydepends onを使用しないでください。を定義するときに がスコープ内にあることを確認するには、代わりに使用してください。あなたの場合、これは次のようになります。xletlet x = ... in let y = ... inxy

let Cons(k, v, trieList) = t in
let subTree = insert (key, value) (findInsert key trieList) in ...
于 2012-11-23T16:38:18.837 に答える
3

トップレベルを使用する場合、同じタイプを2回定義すると、ocamlには1つだけでなく2つのタイプが表示されます。2つのタイプは同じ名前trieであるため、名前が変更さtrie/1017trie/1260ます。型宣言を再コンパイルする場合は、この型に依存する他のすべての宣言を再コンパイルして、古い型ではなく新しい型を使用するようにする必要があります。

その他の注意:あなたは決して書くべきではありません

match foo with
| a -> let PATTERN = a in

代わりにこれを使用する必要があります。

match foo with
| PATTERN ->
于 2012-11-25T21:13:43.167 に答える