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

Posso rimuovere il "` "qui?Qual è la differenza con o senza backtick "` "?

Cordiali saluti!

+0

Questo è correlato (in qualche modo) a: http://stackoverflow.com/questions/1746743/extending-an-existing-type-in-ocaml/1747400#1747400 –

risposta

9

È 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.

+1

afair, il nome preferibile ora è "varianti aperte" . – ygrek

Problemi correlati