2012-04-11 26 views
6

Tôi muốn có một functor lớn Xin chào (Blah: Blah_type) và lưu nó vào tập tin hello.ml, nhưng làm cách nào để làm điều này?Functors trong các tệp riêng biệt trong OCaml?

Nếu tôi chỉ là trong tập tin cấp cao nhất của tôi, tôi muốn có module Hello (Blah: Blah_type) = struct val x = 2 cuối

nhưng để tôi đặt các tham số trong chào như thế nào. ml? Tôi không thể có toàn bộ tập tin là "val x = 2" ...?

Trả lời

4

Không thể thực hiện được. Tệp nguồn luôn được trình bày dưới dạng mô-đun thông thường, không phải là các hàm. Điều này được giải quyết một cách trivially với một mở thêm.

6

OCamlPro có một bản vá biên dịch và công cụ bên ngoài mà có thể hỗ trợ này:

http://www.ocamlpro.com/blog/2011/08/10/ocaml-pack-functors.html

Theo như tôi biết trình biên dịch phát hành chính thức không hỗ trợ các file .ml như functors.

+0

Bản vá của bigfunctor rất hữu ích khi bạn muốn chia một functor trong một số đơn vị biên dịch. Tuy nhiên nó là quá mức cần thiết ở đây, trong đó vấn đề chỉ là gói một functor như là một mục mô-đun của một đơn vị biên dịch đơn. – gasche

+0

Tôi đã giải thích câu hỏi đang tìm kiếm cách tránh Thực hiện trong Hello.Make (...). Các miếng vá và ocp-pack có thể là phương pháp tiếp cận nặng nhưng theo như tôi biết họ là những người duy nhất hiện đang có sẵn. – hcarty

3

Để bổ sung cho câu trả lời ygrek với một mẫu mã sản, thay vì một tập tin foo.ml với nội dung

module type S = sig 
    (* ... *) 
end 

module Hello (M : S) = struct 
    (* ... *) 
end 

module M : S = struct 
    (* ... *) 
end 

module H = Hello(M) 

(* ... *) 

Bạn có thể có hello.ml với nội dung

module type S = sig 
    (* ... *) 
end 

module Make (M : S) = struct 
    (* ... *) 
end 

foo.ml viết lại như

module M : Hello.S = struct 
    (* ... *) 
end 

module H = Hello.Make(M) 

(* ... *) 

PS: Trong trường hợp bạn thấy khó hiểu, việc niêm phong mô-đun M : S hoặc M : Hello.S là tùy chọn (M sẽ bị ép buộc chữ ký này khi được chuyển tới functor), chỉ để cho biết cách thực hiện điều này.

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