2010-11-22 13 views
10

Qual è la differenza tra 'a e '_l?Qual è la differenza tra 'a e' _l?

guardavo questo errore, e non poteva comprenderla:

Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l → float polynomial) list 

risposta

23

_ 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).

1

C'è un tipo di variabile deboli nel messaggio di errore del compilatore, ma non sono sicuro che la variabile deboli è legato l'errore (non vedo come lo stato della variabile di tipo potrebbe essere la causa di questa Messaggio).

Sei sicuro di non aver definito due tipi polynomial? Questa è la domanda appena sopra i due evidenziati da gashe nella sua risposta nelle FAQ ("Error message: a type is not compatible with itself").

Problemi correlati