type level =
[ `Debug
| `Info
| `Warning
| `Error]
¿Puedo eliminar el "` "aquí?¿Cuál es la diferencia con o sin backtick "` "?
¡Sinceramente!
type level =
[ `Debug
| `Info
| `Warning
| `Error]
¿Puedo eliminar el "` "aquí?¿Cuál es la diferencia con o sin backtick "` "?
¡Sinceramente!
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.
afair, el nombre preferible ahora es "variantes abiertas" . – ygrek
Esto está relacionado (algo así como) con: http://stackoverflow.com/questions/1746743/extending-an-existing-type-in-ocaml/1747400#1747400 –