2012-01-30 11 views
7

再帰的なモジュールを定義することは可能ですが、再帰的な署名を定義する方法は誰にも分かりますか?たとえば、私は実現したいと思います:モジュールの再帰的な署名を定義する

module type AAA = sig 
    module Bbb : BBB 
    type 'a t 
    val f : 'a Bbb.t -> 'a t 
end 

module type BBB = sig 
    module Aaa : AAA 
    type 'a t 
    val g : 'a Aaa.t -> 'a t 
end 

助けてもらえますか?私の知る限り、

module rec Aaa : sig 
    type 'a t 
    val f : 'a Bbb.t -> 'a t 
end = Aaa 
and Bbb : sig 
    type 'a t 
    val g : 'a Aaa.t -> 'a t 
end = Bbb 

答えて

6

あなたがすることはできません。

+0

おかげでそれを言及しなかった...'、例えば、署名に名前を与えたいです答え... "最も近い解決策は、"再帰的なビット "を制限することです==>あなたのソリューションの限界についてもっと詳しく教えてください。 – SoftTimur

+1

これは、各署名の自己完結したサブセットを一種の前方宣言として分離できる必要があるため、署名間で任意の再帰を表現することはできません。また、これらのサブセットをそれぞれ2箇所で繰り返していますが、名前を付けることと 'include 'することで助けてくれるはずです。私の返信では、関連するサブセット(タイプt)が十分に小さいので、私はそれをするのは気にしませんでした。 –

4

あなたはそのような何かを書くことができます。あなたは、モジュール定義するとき

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 
+0

あなたのコメントをありがとうは、私は本当にAAA' AOR 'BBB'あなたは...あなたの答えにあなたのための – SoftTimur

関連する問題