你不能,據我可以告訴。最接近的解決方案是限制「遞歸」位,實際需要的表達單獨每個簽名:當你定義模塊
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
然後細化:
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,可能會覺得它應該可以通過使用遞歸的模塊來表達遞歸式簽名(有多少重複):
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
然而,這並不工作:
Error: Unbound module type BB.T
感謝您的答案......最接近的解決方案是限制「遞歸」位==>請您詳細說明解決方案的侷限性嗎? – SoftTimur 2012-01-31 13:42:01
好吧,這不允許你表示簽名之間的任意遞歸,因爲你需要能夠將每個簽名的自包含子集作爲一種前向聲明來分離。此外,你在兩個地方重複每個子集 - 但是命名和包含它們可以在那裏幫助。在我的回答中,我沒有打算這麼做,因爲相關的子集(類型t)足夠小。 – 2012-01-31 15:25:50