2010-05-12 23 views
5

En a.ml se define un tipo de registro t y también se define de forma transparente en a.mli, es decir, en la interfaz d para que la definición de tipo sea disponible a todos los demás archivos.cómo acceder a un tipo definido en un archivo .ml en otro archivo .ml

a.ml también tiene una función, func, que devuelve una lista de t.

Ahora en otro archivo, b.ml i M llamando func, ahora, obviamente, ocaml compilador nt wud ser capaz de inferir el tipo d de los objetos almacenados en la lista D, para compilador es sólo una lista. por lo que en b.ml, i haber algo así como dis,

let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

Ahora aquí me sale un error de compilación diciendo "registro consolidar etiqueta de campo nombre", que tiene sentido ya que el compilador no puede deducir el tipo de vart d.

mi primera pregunta: ¿cómo proporciono explícitamente d tipo de vart como t aquí? intenté hacer "let vart: A.t =" pero obtuve el mismo error .

También intenté crear otra función para buscar el primer elemento de la lista d y mencionar el tipo de devolución como A.t, pero luego obtuve el valor "Unbound A.t". Hice esto:

let firstt = function 
    [] -> 0 
    | x :: _ -> A.t x ;; 

El problema es compilador es incapaz de reconocer A.t (un tipo) en b.ml pero es capaz de reconocer la función A.func. Si elimino A.t del b.ml, no obtengo ningún error de compilación.

Respuesta

7

El compilador es capaz de reconocerA.t para designar el tipo de archivo ta.ml.

Por otro lado, t x donde t es un tipo y x una variable no es una expresión válida. Esta es la fuente de tu problema. El compilador busca el nombre t en las variables exportadas por a.ml. Como no puede encontrar este nombre para una variable, informa un error.

Ahora, para lo que estaba tratando de hacer:

  • tipo anotaciones no son consejos para el compilador en OCaml. Tiene un algoritmo para inferir el tipo (más general, con algunas excepciones en las que no estoy ingresando) y luego verifica que tu anotación sea al menos una particularización del tipo más general. La anotación de tipo que proporciones nunca (de nuevo, con algunas posibles excepciones que no te conciernen) hará que cambie de opinión.

  • Para el acceso en el archivo b.ml el campo f de un registro de tipo rA.t, tipo r.A.f.

0
let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

Aquí tlist es una función, supongo que es de tipo 'a -> A.t list, pero que está solicitando un List.hd en esa función al escribir let vart = List.hd tlist.

Debe proporcionar el argumento para su función para obtener la lista de A.t por ejemplo let tlist = A.func (your_argument-s-_here), supongo que este es el origen de su error, el compilador puede inferir tipos entre módulos.

Cuestiones relacionadas