定义模块的递归签名

时间:2012-01-30 02:10:28

标签: types module ocaml signature

我知道可以定义递归模块,有没有人知道如何定义递归签名?例如,我想知道:

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:6)

据我所知,你不能。最接近的解决方案是将“递归”位限制为分别表达每个签名实际需要的位:

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

答案 1 :(得分:4)

你可以这样写:

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