2012-01-19 13 views
6

he definido la siguiente interfaz y el módulo:Ámbito de constructores de un módulo en OCaml

module type TYPE = 
    sig 
    type t 
    end 

module Type = (struct 
    type t = 
    | TBot 
    | T of int 
    | TTop 
end: TYPE) 

Ahora se dan cuenta de que si escribo fuera Type.T 5, el compilador me da error en Error: Unbound constructor Type.T. Si elimino la firma y guardo el módulo, el error desaparecerá.

1) Así que mi primera pregunta es, ¿cómo cambiar la firma de modo que pueda usar los constructores en el exterior?

2) Una forma es definir un constructor explícitamente de la siguiente manera, ¿cree que es una forma convencional? Una desventaja que puedo ver ahora es que no permite construir TBot o TTop.

module type TYPE = 
    sig 
    type t 
    val make : int -> t 
    end 

module Type = (struct 
    ... 
    let make (i: int) : t = 
     T i 
end: TYPE) 

3) ¿Es siempre necesario dejar que el exterior sea capaz de construir un valor dentro de un módulo?

Respuesta

6

1) Usted tiene que exportar la declaración de tipo, de lo contrario, t se considera tan abstracto y luego es necesario definir y constructores de exportación (véase 2)):

module type TYPE = sig 
    type t = 
    | TBot 
    | T of int 
    | TTop 
end 

module Type : TYPE = struct 
    type t = 
    | TBot 
    | T of int 
    | TTop 
end 

2) Sí, se trata de una perfectamente bien. Para definir la parte superior e inferior, sólo hay que definir (y exportación) nuevos constructores:

module type TYPE = sig 
    ... 
    val top: t 
    val bot: t 
end 

module Type = struct 
    ... 
    let bot = TBot 
    let top = TTop 
end 

3) No entiendo su pregunta