Как вернуть модуль первого класса из того же модуля? - PullRequest
1 голос
/ 02 ноября 2019

Этот код выдает «Тест несвязанного типа модуля»:

module type Test = sig
  val test : int -> (module Test)
end

Как мне сделать эту работу?

1 Ответ

2 голосов
/ 02 ноября 2019

Для возврата того же самого модуля, который был сконструирован, требуется рекурсия. Однако рекурсивные типы модулей не допускаются напрямую только рекурсивными модулями. Таким образом, решение заключается в том, чтобы обернуть тип модуля внутри рекурсивного модуля:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...