Дружественные модули в OCaml

В настоящее время у меня есть два «уровня» модулей, которые представляют отношения данных идентификатора в базе данных.

Первый уровень определяет типы идентификаторов, такие как IdUser.t или IdPost.t , а второй уровень определяет типы данных, такие как Пользователь. t или Post.t . Мне нужно, чтобы все модули первого уровня были скомпилированы до модулей второго уровня, потому что Post.t должен содержать IdUser.t его автора и ] User.t содержит IdPost.t из пяти последних посещенных им постов.

Прямо сейчас IdUser.t предоставляет функции, которые должны использоваться только User.t , например возможность преобразовывать IdUser.t в IdUser.current : по соображениям безопасности это преобразование должно всегда выполняться только функцией User.check_password . Поскольку IdUser и User являются независимыми модулями, Мне нужно определить эти функции как общедоступные и полагаться на соглашения, чтобы не вызывать их где-либо за пределами User , что довольно грязно. Симметричная ситуация возникает в IdPost.mine :

module IdUser : sig
  type t
  type current
  val current_of_t : t -> current (* <--- Should not be public! *)
end = struct 
  type t = string
  type current = string
  let current_of_t x = x
end

module IdPost : sig
  type t
  type mine
  val mine_of_t   : t -> mine (* <--- Should not be public! *)
end = struct 
  type t = string
  type mine = string
  let mine_of_t   x = x
end

module Post : sig 
 (* Should not "see" IdUser.current_of_t but needs IdPost.mine_of_t *)
  val is_mine : IdUser.current -> IdPost.t -> IdPost.mine
end 

module User : sig
  (* Should not "see" IdPost.mine_of_t but needs IdUser.current_of_t *)
  val check_password : IdUser.t -> password:string -> IdUser.current
end

Есть ли способ определить функцию current_of_t: t -> current в IdUser , которая может быть только вызывается из модуля Пользователь ?

EDIT : это был упрощенный пример одной пары модулей, но есть очевидное решение для одной пары, которое не может быть обобщено на несколько пар, и мне нужно решить это для нескольких пар - на самом деле около 18 пар ... Итак, я расширил его, чтобы он стал примером двух пар.

5
задан Victor Nicollet 23 February 2011 в 10:44
поделиться