2011-01-22 42 views
5

Hola, esta es la primera vez que publico en Stack Overflow y me he encontrado con un problema al intentar construir un tipo en OCamlTipos recursivos en OCaml?

Estoy intentando construir un árbol tipo que tenga nodos/hojas/etc. Esto es lo que tengo hasta ahora.

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

Mi nodo se supone que es un tipo que contiene su nombre y otro árbol como una tupla. Pero cuando traté de compilar esto, dijo que el árbol requería dos argumentos. Así que probé:

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

y todavía recibía un error. ¿Algo que notaste que estaba haciendo mal? ¡Gracias!

+0

Resulta que mi sintaxis era incorrecta. En realidad debería ser Nodo ('a * (' a, 'b) árbol) – Brian

+1

Correcto. Sin embargo, sería educado aceptar la respuesta de Gasche, ya que responde tu pregunta. Me pregunto si está seguro de que quiere tipos distintos para los nodos de hojas e interiores. –

Respuesta

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

Es probable que desee que sus nodos dos tienen más de un hijo, aunque

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

PD: Cuidado que en una declaración de tipo, Foo of bar * baz y Foo of (bar * baz) no son lo mismo: la primera es un constructor Foo con dos campos, el segundo tiene solo un campo, que es del tipo (bar * baz).

+0

¿Puedes explicar el impacto de omitir el paréntesis en la definición del constructor? Pensé que 'bar * baz' era simplemente una forma más simple de definir tuplas. – Antoine

Cuestiones relacionadas