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.