type level =
[ `Debug
| `Info
| `Warning
| `Error]
Posso rimuovere il "` "qui?Qual è la differenza con o senza backtick "` "?
Cordiali saluti!
type level =
[ `Debug
| `Info
| `Warning
| `Error]
Posso rimuovere il "` "qui?Qual è la differenza con o senza backtick "` "?
Cordiali saluti!
È difficile rispondere a questa domanda sì o no.
È possibile rimuovere i backtick e le parentesi quadre. Poi si dovrebbe
type level2 = Debug | Info | Warning | Error
Nei casi più semplici, questo tipo è è molto simile al vostro tipo di level
. Ha 4 costruttori costanti.
In casi più complessi, tuttavia, i tipi sono molto diversi. Il tuo tipo level
è un tipo polymorphic variant, che è più flessibile di level2
sopra. I costruttori di level
possono apparire in qualsiasi numero di tipi nello stesso ambito, e level
partecipa relazioni sottotipizzazione:
# 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
Il punto di questo esempio è che anche se x è di tipo level
, può essere trattata come sebbene fosse di tipo levelx
anche perché level
è un sottotipo di levelx
.
Non esistono relazioni di sottotipizzazione tra tipi di varianti non polimorfiche come level2
e in effetti non è possibile utilizzare lo stesso nome di costruttore in più di un tipo nello stesso ambito.
I tipi di varianti polimorfiche possono anche essere aperti. È un grande argomento; se sei interessato dovresti vedere la sezione 4.2 del manuale di OCaml, linkato sopra.
afair, il nome preferibile ora è "varianti aperte" . – ygrek
Questo è correlato (in qualche modo) a: http://stackoverflow.com/questions/1746743/extending-an-existing-type-in-ocaml/1747400#1747400 –