Bạn không có thể, như xa như tôi có thể nói. Các giải pháp gần nhất là để hạn chế các bit "đệ quy" với những gì là thực sự cần thiết để thể hiện mỗi chữ ký riêng:
module type AA =
sig
module B : sig type t end
type t
val f : unit -> B.t
end
module type BB =
sig
module A : sig type t end
type t
val g : unit -> A.t
end
Và sau đó tinh chỉnh khi bạn xác định các module:
module rec A : AA with module B = B =
struct
module B = B
type t = int
let f() = B.g()
end
and B : BB with module A = A =
struct
module A = A
type t = int
let g() = A.f()
end
FWIW, người ta có thể nghĩ rằng chúng ta có thể bày tỏ chữ ký đệ quy (với nhiều sự lặp lại) bằng cách sử dụng các module đệ quy:
module rec AA :
sig
module type T = sig module B : BB.T end
end =
struct
module type T = sig module B : BB.T end
end
and BB :
sig
module type T = sig module A : AA.T end
end =
struct
module type T = sig module A : AA.T end
end
Tuy nhiên, điều đó không làm việc:
Error: Unbound module type BB.T
Nguồn
2012-01-30 14:21:10
Cảm ơn bạn câu trả lời ... 'giải pháp gần nhất là để hạn chế các" đệ quy "bit' ==> Bạn có thể vui lòng giải thích thêm về các giới hạn của giải pháp của bạn? – SoftTimur
Vâng, điều này không cho phép bạn thể hiện sự đệ quy tùy ý giữa các chữ ký, bởi vì bạn cần có khả năng cô lập một tập hợp con độc lập của từng chữ ký như một loại khai báo chuyển tiếp. Ngoài ra, bạn đang lặp lại từng tập con trong hai vị trí đó - nhưng việc đặt tên và 'bao gồm' chúng có thể trợ giúp ở đó. Trong trả lời của tôi, tôi không bận tâm để làm điều đó, bởi vì các tập hợp con có liên quan (loại t) là đủ nhỏ. –