_
indicata una variabile debolmente polimorfica: è in una posizione in cui non può essere generalizzato.
Ci sono due spiegazioni relative al polimorfismo debole nelle FAQ OCaml: vedere A function obtained through partial application is not polymorphic enough e il successivo.
Ciò accade generalmente quando si utilizza un riferimento non locale (il cui tipo non può essere generalizzato) o quando si definiscono funzioni polimorfiche che non sono funzioni sintattiche (non iniziano con fun x -> ..
ma piuttosto un'applicazione di funzione). In alcuni casi c'è una soluzione facile (eta-espansione, vedi le FAQ), a volte non c'è, e a volte il tuo programma è stato appena falso.
Un semplice esempio: let a = ref []
non ha il tipo polimorfo a list ref
. In caso contrario, è possibile utilizzare sia come int list
sia come bool list
e mescolare elementi di diverso tipo modificando il riferimento. Ottiene invece un tipo '_a list ref
. Ciò significa che il tipo non è polimorfico, ma semplicemente sconosciuto. Una volta che fai qualcosa con a
con un tipo particolare, corregge '_a
una volta per tutte.
# let a = ref [];;
val a : '_a list ref = {contents = []}
# let sum_of_a = List.fold_left (+) 0 !a;;
val sum_of_a : int = 0
# a;;
- : int list ref = {contents = []}
Per una spiegazione approfondita della restrizione valore e la limitazione del valore "rilassato" in realtà implementato nel tipo di controllo OCaml, vedere il documento Relaxing the Value Restriction da Jacques Garrigue (2004).