2011-01-22 21 views
5

Witam, to jest mój pierwszy wpis w Stack Overflow i napotkałem problem przy próbie skonstruowania typu w OCamlTypy rekursywne w OCaml?

Próbuję skonstruować drzewo typów, które ma węzły/liście/etc. To jest to, co do tej pory miałem.

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a * tree) | .... 

Mój węzeł powinien być typem, który zawiera jego nazwę i inne drzewo jako krotkę. Ale kiedy próbowałem to skompilować, to drzewo wymagało dwóch argumentów. Tak więc próbowałem:

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a * tree ('a*'b)) 

i nadal otrzymywałem błąd. Czy zauważyłeś coś, co robiłem źle? Dzięki!

+0

Okazało się, że moja składnia była po prostu nieprawidłowa. Powinien to być węzeł ("a * (" a, "b) drzewo) – Brian

+1

Zgadza się. Grzecznie byłoby zaakceptować odpowiedź Gasche'a, ponieważ odpowiada na twoje pytanie. Zastanawiam się, czy jesteś pewny, że chcesz odrębne typy dla liści i węzłów wnętrza? –

Odpowiedz

9
type ('a, 'b) tree = Empty | Leaf of 'b | Node of 'a * ('a, 'b) tree 

Prawdopodobnie chcesz węzły dwa mają więcej niż jedno dziecko, chociaż

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a, 'b) tree * 'a * ('a, 'b) tree 

PS: Uważaj niż w deklaracji typu, Foo of bar * baz i Foo of (bar * baz) nie są takie same: pierwsza to konstruktor Foo z dwoma polami, drugie ma tylko jedno pole, które jest typu (bar * baz).

+0

Czy możesz wyjaśnić wpływ pominięcia nawiasów w definicji konstruktora? Myślałem, że 'bar * baz' jest prostszym sposobem definiowania krotek. – Antoine