【发布时间】:2011-07-02 14:11:36
【问题描述】:
我目前有两个“层”模块表示数据库中的标识符-数据关系。
第一层定义标识符类型,例如IdUser.t 或IdPost.t,而第二层定义数据类型,例如User.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
有没有办法在IdUser 中定义一个只能从模块User 中调用的current_of_t : t -> current 函数?
编辑:这是 one 一对模块的简化示例,但是对于不能推广到多对的单对模块有一个明显的解决方案,我需要为多对解决这个问题 - 实际上大约 18 对......所以,我将其扩展为 two 对的示例。
【问题讨论】:
标签: module dependencies ocaml friend