2012-01-19 13 views
6

I zostały zdefiniowane następujące interfejs oraz moduł:Zakres konstruktorów modułu w SML

module type TYPE = 
    sig 
    type t 
    end 

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

teraz zdaję sobie sprawę, że jeśli piszę poza Type.T 5, kompilator daje mi en błędu Error: Unbound constructor Type.T. Jeśli usuniemy podpis i zatrzymam moduł, błąd zniknie.

1) Więc moim pierwszym pytaniem jest, jak zmienić podpis tak, że mogę używać konstruktorów na zewnątrz?

2) Jednym ze sposobów jest wyraźne zdefiniowanie konstruktora w następujący sposób: czy sądzisz, że jest to metoda konwencjonalna? Jedną z wad, jakie teraz widzę, jest to, że nie pozwala ona na konstruowanie TBot lub 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) Czy zawsze jest konieczne, aby zewnętrza była w stanie zbudować wartość wewnątrz modułu?

Odpowiedz

6

1) Masz na eksport deklaracji typu, w przeciwnym razie t uważany jest za streszczenie i wtedy trzeba określić i konstruktorzy eksportu (patrz punkt 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) Tak, to jest doskonały sposób. Aby określić górny i dolny, po prostu trzeba określić (i eksport) nowych konstruktorów:

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

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

3) Nie rozumiem pytanie