2012-01-19 5 views
6

tôi đã xác định các giao diện và mô-đun sau:Phạm vi xây dựng của một mô-đun trong OCaml

module type TYPE = 
    sig 
    type t 
    end 

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

Bây giờ tôi nhận ra rằng Nếu tôi viết bên ngoài Type.T 5, trình biên dịch sẽ cho tôi en lỗi Error: Unbound constructor Type.T. Nếu tôi xóa chữ ký và giữ module, lỗi sẽ biến mất.

1) Vì vậy, câu hỏi đầu tiên của tôi là, làm thế nào để thay đổi chữ ký sao cho tôi có thể sử dụng các nhà thầu bên ngoài?

2) Một cách để xác định một hàm tạo rõ ràng như sau, bạn có nghĩ đó là cách thông thường không? Một bất lợi mà tôi có thể thấy bây giờ là nó không cho phép xây dựng TBot hoặc 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) Luôn luôn cần thiết để bên ngoài có thể xây dựng một giá trị bên trong một mô-đun?

Trả lời

6

1) Bạn phải xuất khẩu khai báo kiểu, nếu không, t được coi là trừu tượng và sau đó bạn cần phải xác định và nhà thầu xuất khẩu (xem 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) Vâng, đó là một một cách hoàn hảo. Để xác định trên và dưới, bạn chỉ cần phải xác định (và xuất khẩu) nhà xây dựng mới:

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

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

3) Tôi không hiểu câu hỏi của bạn