2012-01-19 5 views
8

he definido dos tipos de registro:dos campos de dos registros tienen la misma etiqueta en OCaml

type name = 
    { r0: int; r1: int; c0: int; c1: int; 
     typ: dtype; 
     uid: uid (* key *) } 

and func = 
    { name: string; 
     typ: dtype; 
     params: var list; 
     body: block } 

y tengo un error más tarde para una línea de código: Error: The record field label typ belongs to the type Syntax.func but is mixed here with labels of type Syntax.name

Podría alguien decirme si no deberíamos tener dos campos de dos registros que tengan la misma etiqueta, como typ aquí, lo que hace que el compilador confunda.

+2

Actualización: desde OCaml versión 4.01.0 se elimina el requisito de etiquetas de campo de registro únicas. –

+0

@Str. Creo que eso solo es cierto si los nombres tienen diferentes tipos, lo que no se aplica aquí. – johnbakers

Respuesta

13

No, no se puede porque se romperá la inferencia del tipo.

por cierto, puede utilizar espacio de nombres del módulo de arreglar eso:

module Name = struct 
    type t = { r0:int; ... } 
end 

module Func = struct 
    type t = { name: string; ... } 
end 

Y más tarde, se puede prefijar el nombre del campo por el módulo de la derecha:

let get_type r = r.Name.typ 
let name = { Name.r0=1; r1=2; ... } 
let f = { Func.name="foo"; typ=...; ... } 

en cuenta que necesita para prefijar el primer campo solamente, y el compilador entenderá automáticamente qué tipo tiene el valor que está escribiendo.

8

El lenguaje Ocaml requiere que todos los campos dentro de un módulo tengan nombres diferentes. De lo contrario, no será capaz de inferir el tipo de la función a continuación

let get_typ r = r.typ ;; 

, ya que podría ser de tipo name -> dtype o de tipo func -> dtype

Por cierto, me sugieren que usted tenga un sufijo como para _t todos los nombres de tus tipos

+1

Gracias por su comentario ... ¿Por qué crees que es mejor tener un sufijo como '_t' para los nombres de tipos? – SoftTimur

+1

Solo una cuestión de legibilidad. Siento que 'dtype' suena como cierto valor (por ejemplo, alguna función). –

+0

@BasileStarynkevitch ya que los contextos de tipo y valor siempre se conocen, seguramente no hay ambigüedad? – Ashe

Cuestiones relacionadas