В настоящее время у меня есть два «уровня» модулей, которые представляют отношения данных идентификатора в базе данных.
Первый уровень определяет типы идентификаторов, такие как 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 пар ... Итак, я расширил его, чтобы он стал примером двух пар.