2011-11-02 11 views
5

1) que tienen una unión abierta se define de la siguiente manera:definiciones de tipo abierto con los sindicatos

type 'a choice = [> `One | `Other ] as 'a 

que luego tratar de definir un tipo choice_list:

type choice_list = choice list 

que no funciona. ¿Cómo se definen los tipos donde uno o más de los componentes son uniones abiertas?

2) Si en lugar de eso renunciar a la creación del tipo choice_list, y sólo tiene que utilizar un choice list, cuando intento escribir una declaración de interfaz/firma usando una lista de opciones,

val choice_handler : choice list -> int 

el compilador se queja de que type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities.

Mi pregunta es, ¿cómo se escribe la declaración de tipo de lista de opciones en la interfaz/firma.

Respuesta

9

El compilador intenta decirle que choice es un tipo parametrizado. En el nivel de tipo, tiene una aridad de 1. En otras palabras, debe proporcionar un parámetro de tipo. Usted ha restringido el parámetro a ser un subtipo de [`One|`Other], pero aparte de que puede ser de cualquier tipo:

# ([`One; `Third] : 'a choice list);; 
- : [> `One | `Other | `Third ] choice list = [`One; `Third] 

Si desea definir una lista de opciones, el tipo adicional tiene que venir de alguna parte. Es decir, tiene que ser un parámetro para el nuevo tipo:

# type 'a choice_list = 'a choice list;; 
type 'a choice_list = 'a choice list constraint 'a = [> `One | `Other ] 

(Este tipo de construcciones se complican bastante rápido, en mi experiencia.)

Cuestiones relacionadas