¿Por qué la necesidad de firmas en módulos mutuamente recursivos en OCaml?
-
13-10-2019 - |
Pregunta
Cuando se utilizan mutuamente recursivos definiciones del módulo en OCaml, es necesario dar a las firmas, incluso en el archivo .ml
. Esta es una molestia, donde también quiero exponer una interfaz dada desde el .mli
, como termino repitiendo la firma dos veces. : (
module rec Client : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ server: ('serv,'cli) Server.t
; (* other members ... *)
}
end
and Server : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ mutable clients: ('serv,'cli) Client.t list
; mutable state: 'serv
}
(* functions again ... *)
end
Esta es una aproximación de lo que estoy haciendo (objetos de tipo Client
conocen la Server
que les instancia. Server
s conocen sus Client
s).
Por supuesto, las firmas se repiten en el .mli
. ¿Por qué es esto necesario?
(Nota:. No me quejo, pero en realidad quieren saber si hay un tipo de teoría o "difícil problema del compilador" -relacionado razón para esto)
Solución
Mi suposición: con el fin de compilar módulos recursivas compilador necesita anotaciones de tipo de aplicación. En el archivo MLI (si está utilizando alguno) tipos de estos módulos se puede restringir aún más o escondido por completo, por lo que en el caso general, no es razonable que el compilador puede esperar encontrar tipos útiles en WRT MLI resolver tipo recursividad.
Otros consejos
Por lo que yo sé, no hay forma de evitar que esto. En un nivel muy alto, por lo que se refiere al compilador, el tipo de firma del cliente es incompleta hasta que se conoce el tipo de firma del servidor, y viceversa. En principio, no es una forma de evitar esto: el compilador podría cruzar referencia a los archivos de .mli en tiempo de compilación. Sin embargo, este enfoque tiene desventajas: se une algunas de las responsabilidades del compilador y el enlazador, y hace que la compilación modular (sin doble sentido) más difícil
.Si está interesado, recomiendo la propuesta original de Xavier Leroy para módulos recursivas.