2017-02-22 18 views
6

Tôi là người mới bắt đầu của OCaml. Tôi tự hỏi làm thế nào để xác định loại dữ liệu đệ quy lẫn nhau trong các tệp riêng biệt.OCaml: có thể định nghĩa các cấu trúc dữ liệu đệ quy lẫn nhau trong các tệp riêng biệt

Tôi biết chương trình sau là hợp pháp.

type t1 = A of int | B of t2 
and t2 = C of float | C of t1 

Bây giờ, tôi muốn xác định này t1t2 trong các tập tin khác để có thể đọc (vì có rất nhiều chức năng util được yêu cầu indivisually).

tôi cũng biết, tôi có thể xác định t1t2 như trên bằng cách làm cho .mli tập tin và ẩn các chi tiết thực hiện (chỉ cần viết type t1type t2 trong .mli tập tin).

Nhưng giờ tôi không muốn ẩn chúng. Có ai biết cách làm điều đó không?

Tôi hy vọng giải pháp đơn giản (không sử dụng phức tạp hoặc ma thuật ...).

Trả lời

7

Trong triển khai OCaml hiện tại, biểu đồ phụ thuộc đơn vị biên dịch phải là tuần hoàn. Đặt đơn giản hơn, các đơn vị biên dịch (nghĩa là các tệp khác nhau), không thể tham khảo lẫn nhau một cách đệ quy.

Giới hạn này là quá gần đúng, vì nó không cho phép các chương trình hợp lệ, và có thể mâu thuẫn với trực giác, vì có thể viết các mô-đun đệ quy trong một đơn vị biên dịch đơn. Lý do cho giới hạn này xuất phát từ sự phức tạp của việc kiểm tra kiểu của một mô-đun đệ quy. Một mô-đun đệ quy không thể được đánh dấu là một thực thể độc lập, vì nó đòi hỏi toàn bộ các mô-đun có liên quan đến đệ quy. Nhưng hệ thống biên dịch riêng biệt OCaml yêu cầu mỗi đơn vị biên dịch phải độc lập và có thể gõ được. Nếu OCaml không sử dụng một trình biên dịch riêng biệt (và liên kết một chương trình như một tổng thể), thì có thể thực hiện các đơn vị đệ quy.

Giải pháp một phần sẽ là yếu tố các bộ phận của giao diện độc lập với sự đệ quy lẫn nhau và triển khai chúng trong một mô-đun riêng biệt. Ví dụ, bạn có thể xác định các loại như sau:

type 'b a = A of int | B of 'b 
type 'a c = C of float | C of 'a 
type t1 = t2 a and t2 = t1 c 

Bây giờ bạn có thể định nghĩa một bộ phận mạch hở của giao diện cho 'b a. Giao diện này phải là chung đối với biến loại 'b (nói cách khác nó không nên chạm vào nó). Trong ví dụ của chúng tôi, thật khó tưởng tượng được giao diện đó, nhưng giả sử rằng ví dụ là tổng hợp, nhưng đối với các loại sản phẩm, phương thức này sẽ có ý nghĩa (xem, type 'b a = {a : int; b : 'b} - bạn có thể triển khai tất cả các chức năng liên quan đến trường a).

Lưu ý cuối cùng, tôi muốn nói rằng các mô-đun đệ quy hiếm khi cần thiết trong thực tế và thường biểu thị một vấn đề trong thiết kế. Đặc biệt, khi cần di chuyển các định nghĩa trong các mô-đun riêng biệt - điều đó cho thấy, các phép trừu tượng không được chọn đúng cách. Nó có thể là trường hợp của khóa học, rằng vấn đề cơ bản vốn đã phức tạp, nhưng điều này là rất hiếm trong cuộc sống thực.

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