Определить рекурсивные подписи для модулей - PullRequest
7 голосов
/ 30 января 2012

Я знаю, что можно определить рекурсивные модули, кто-нибудь знает, как определить рекурсивные сигнатуры?Например, я хотел бы понять:

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 ]

6 голосов
/ 30 января 2012

Вы не можете, насколько я могу судить. Наиболее близким решением является ограничение «рекурсивных» битов тем, что фактически необходимо для выражения каждой сигнатуры в отдельности:

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
4 голосов
/ 30 января 2012

Вы можете написать что-то вроде этого:

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
...