Ocaml 如何从同一个模块返回第一类模块?

Ocaml 如何从同一个模块返回第一类模块?,ocaml,Ocaml,此代码给出“未绑定模块类型测试”: 如何实现这一点?返回与正在构造的模块相同的模块显然需要递归。但是,递归模块类型不直接允许,只允许递归模块。因此,解决方案是将模块类型包装在递归模块中: module rec Test: sig module type t = sig val test: int -> (module Test.t) end end = Test 请注意,上面的代码使用了一个经典技巧,以避免在没有任何运行时组件的情况下编写两次模块类型。 然后,新模块类型可用于: mo

此代码给出“未绑定模块类型测试”:


如何实现这一点?

返回与正在构造的模块相同的模块显然需要递归。但是,递归模块类型不直接允许,只允许递归模块。因此,解决方案是将模块类型包装在递归模块中:

module rec Test: sig
  module type t = sig val test: int -> (module Test.t) end
end = Test
请注意,上面的代码使用了一个经典技巧,以避免在没有任何运行时组件的情况下编写两次模块类型。 然后,新模块类型可用于:

module rec X: Test.t = struct let test x = (module X:Test.t) end;;
module T = (val X.test 1)
module T2 = (val T.test 2)

IIRC,只有函子才能返回模块。@Bergi OCaml中有第一类模块。所以
(val X.test 1)
只返回另一个
X
?不管怎样,我想这正是我所需要的。谢谢大家!<代码>X。测试1返回一个打包模块,该模块是
X
(val…
的副本,将打包模块解压为标准模块。
module rec X: Test.t = struct let test x = (module X:Test.t) end;;
module T = (val X.test 1)
module T2 = (val T.test 2)