2012-05-10 19 views
6

Hãy nói rằng tôi có một mô-đun M tham số của một mô-đun F:Làm thế nào xác định một chữ ký mô-đun mà thực hiện mô-đun được tham số hóa bởi một functor

module M (F : sig type id type data end) = 
struct 
type idtype = F.id 
type datatype = F.data 
type component = { id : idtype; data : datatype } 
let create id data = { id; data } 
let get_comp_data comp = comp.data 
let get_comp_id comp = comp.id 
end 

vì vậy tôi sử dụng nó như thế này:

module F1 = struct type id = int type data = float end 
module MF1 = M(F1) 

let comp = MF1.create 2 5.0 
let id = MF1.get_comp_id comp 

Bây giờ, nếu tôi muốn M để khớp chữ ký S:

module type S = 
sig 
    type idtype 
    type datatype 
    type component 
    val create : idtype -> datatype -> component 
    val get_comp_data : component -> datatype 
    val get_comp_id : component -> idtype 
end 

module F1 = struct type id = int type data = float end 
module MF1 = (M(F1) : S) 

let comp = MF1.create 2 5.0 
let id = MF1.get_comp_id comp 

những gì làm phiền tôi ở đây là, để xác định get_comp_dataget_comp_id, tôi cần phải chỉ định idtypedatatype trong mô-đun S; bây giờ chỉ cần tưởng tượng tôi có các loại bản ghi khác trong M với các loại của riêng mình, tôi sẽ có một tá loại để xác định trong S? Có cách nào đơn giản hơn để tránh điều đó không?

Trả lời

9

Cách tự nhiên để thực hiện việc này là niêm phong mô-đun tại trang định nghĩa, không phải trang web sử dụng. Sau đó, bạn chỉ cần thể hiện loại chia sẻ một lần:

module M (F : sig type id type data end) : 
    S with type idtype = F.id and datatype = F.data 
    = struct ... end 

Nếu tham số functor phức tạp hơn thì bạn cũng có thể chia sẻ toàn bộ mô-đun thay vì các loại riêng lẻ. Ví dụ:

module type TYPES = sig type id type data (* ...and more... *) end 

module type S = 
sig 
    module Types : TYPES 
    type component 
    val create : Types.id -> Types.data -> component 
    val get_comp_data : component -> Types.data 
    val get_comp_id : component -> Types.id 
end 

module M (F : TYPES) : S with module Types = F 
    = struct ... end 

Hoặc thậm chí bạn có thể parameterise chữ ký riêng của mình, bằng cách xếp lồng nó vào functor khác:

module type TYPES = sig type id type data (* ...and more... *) end 

module S (F : TYPES) = 
struct 
    module type S = 
    sig 
    type component 
    val create : F.id -> F.data -> component 
    val get_comp_data : component -> F.data 
    val get_comp_id : component -> F.id 
    end 
end 

module M (F : TYPES) : S(F).S 
    = struct ... end 
+0

không biết bạn có thể đặt một module trong một mô-đun có cùng tên; bẩn thỉu – codablank1

Các vấn đề liên quan