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. Servers conocen sus Clients).

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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top