2009-12-20 12 views
9

En la especificación del lenguaje ocaml, hay una sección corta:¿Qué tipo de ocaml 'a. 'a ->' una media?

poly-typexpr ::= typexpr 
       | { ' ident }+ . typexpr 

No hay una explicación en el texto, y la única instancia de poly-typexpr es en la definición de un tipo de método:

method-type ::= method-name : poly-typexpr 

Lo que hace esto permitirme hacer?

Respuesta

12

poly-typexpr también está permitido como tipo de campo de registro (consulte Section 6.8.1). Estos se denominan comúnmente "tipos existenciales", aunque existe some debate on that point. El uso de un tipo polimórfico de esta manera cambia el alcance de la variable de tipo. Por ejemplo, comparar los tipos:

type 'a t = { f : 'a -> int; } 
type u = { g : 'a. 'a -> int; } 

t es realmente una familia de tipos, uno para cada valor posible de 'a. Cada valor del tipo 'a t debe tener un campo f con el tipo 'a -> int. Por ejemplo:

# let x = { f = fun i -> i+1; } ;; 
val x : int t = {f = <fun>} 
# let y = { f = String.length; } ;; 
val y : string t = {f = <fun>} 

En comparación, u es un tipo único. Cada valor del tipo u debe tener un campo g con el tipo 'a -> int para cualquiera'a. Por ejemplo:

# let z = { g = fun _ -> 0; } ;; 
val z : u = {g = <fun>} 

señalar aquí que g no depende del tipo de su entrada en absoluto; si lo hiciera, no tendría el tipo 'a. 'a -> int. Por ejemplo:

# let x2 = { g = fun i -> i+1; } ;; 
This field value has type int -> int which is less general than 'a. 'a -> int 
Cuestiones relacionadas