2012-01-19 12 views
6

ho definito la seguente interfaccia e il modulo:Ambito di costruttori di un modulo in OCaml

module type TYPE = 
    sig 
    type t 
    end 

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

Ora mi rendo conto che se scrivo di fuori Type.T 5, il compilatore mi darà en errore Error: Unbound constructor Type.T. Se rimuovo la firma e mantieni il modulo, l'errore scompare.

1) Quindi la mia prima domanda è: come modificare la firma in modo tale da poter utilizzare i costruttori all'esterno?

2) Un modo è definire esplicitamente un costruttore come segue, pensi che sia un modo convenzionale? Uno svantaggio che posso vedere ora è che non consente di costruire 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) E 'sempre necessario far fuori essere in grado di costruire un valore all'interno di un modulo?

risposta

6

1) È necessario esportare la dichiarazione del tipo, in caso contrario, t è considerato come astratta e quindi è necessario definire e costruttori di esportazione (vedi punto 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ì, si tratta di un perfettamente alla perfezione. Per definire alto e in basso, devi solo definire (ed esportazione) nuovi costruttori:

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

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

3) Non capisco la tua domanda