Al utilizar definiciones de módulos mutuamente recursivas en OCaml, es necesario dar firmas, incluso en el archivo .ml
. Esto es una molestia en la que también quiero exponer una interfaz determinada del .mli
, ya que termino repitiendo la firma dos veces. :(!¿Por qué el requisito de firmas en módulos mutuamente recursivos en OCaml?
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
Ésta es una aproximación de lo que estoy haciendo (Client
objetos de tipo conocen la Server
que les instancia. Server
s conocen sus Client
s).
Por supuesto, las firmas son . repetida en el .mli
¿por qué es necesario
. (Nota: no me quejo, pero en realidad quiero saber si hay un tipo de teoría o "difícil problema del compilador" -relacionado razón para esto)?
Eso tiene sentido. De hecho, hago uso de esta "característica" al exponer una firma de tipo diferente para consumidores externos en el '.mli'; Debería haberme dado cuenta. – Ashe
Buena conjetura. Las anotaciones de tipo son obligatorias porque la inferencia en el caso de módulos recíprocos y funtores es indecidible en general. La literatura está llena de intentos de perfeccionar los sistemas de tipo para optimizar los requisitos mínimos de anotación y conservar la solidez. Si el sistema de tipo de OCaml podría mejorarse para reducir la carga de requisitos de anotación es discutible. –