2011-11-22 3 views
11
type level = 
[ `Debug 
| `Info 
| `Warning 
| `Error] 

¿Puedo eliminar el "` "aquí?¿Cuál es la diferencia con o sin backtick "` "?

¡Sinceramente!

+0

Esto está relacionado (algo así como) con: http://stackoverflow.com/questions/1746743/extending-an-existing-type-in-ocaml/1747400#1747400 –

Respuesta

9

Es difícil responder a esta pregunta, sí o no.

Puede quitar los apoyos y los corchetes. Entonces tendría que

type level2 = Debug | Info | Warning | Error 

En los casos más simples, este tipo es es muy similar a su tipo de level. Tiene 4 constructores constantes.

En casos más complejos, sin embargo, los tipos son bastante diferentes. Su tipo level es un tipo polymorphic variant, que es más flexible que level2 anterior. Los constructores de level pueden aparecer en cualquier número de diferentes tipos en el mismo alcance, y level participa en las relaciones de subtipificación:

# type level = [`Debug | `Info | `Warning | `Error] 
# type levelx = [`Debug | `Info | `Warning | `Error | `Fatal] 

# let isfatal (l: levelx) = l = `Fatal;; 
val isfatal : levelx -> bool = <fun> 
# let (x : level) = `Info;; 
val x : level = `Info 
# isfatal (x :> levelx);; 
- : bool = false 

El punto de este ejemplo es que a pesar de que x tiene tipo level, puede ser tratado como aunque fue del tipo levelx también, porque level es un subtipo de levelx.

No existen relaciones de subtipado entre tipos de variante no polimórficos como level2, y de hecho no puede usar el mismo nombre de constructor en más de uno de esos tipos en el mismo ámbito.

Los tipos de variantes polimórficas también pueden tener una duración indefinida. Es un gran tema; si está interesado, debería ver la sección 4.2 del manual OCaml, vinculado anteriormente.

+1

afair, el nombre preferible ahora es "variantes abiertas" . – ygrek

Cuestiones relacionadas