Для возврата того же самого модуля, который был сконструирован, требуется рекурсия. Однако рекурсивные типы модулей не допускаются напрямую только рекурсивными модулями. Таким образом, решение заключается в том, чтобы обернуть тип модуля внутри рекурсивного модуля:
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)