Передать модули в другие модули
Я пытаюсь использовать Irmin с MirageOS, и я борюсь со всеми этими модулями. Я взглянул на источники Canopy, чтобы попытаться выяснить, как предполагается использовать Irmin, и у меня есть это:
let start console clock resolver conduit =
let (module Context) = Irmin_mirage.context (resolver, conduit) in
let module Mirage_git_memory = Irmin_mirage.Git.Mem.KV(Context)(Git.Inflate.M) in
let module Store = Mirage_git_memory(Irmin.Contents.String) in
[...]
С помощью функции запуска я могу использовать Store fine, установить и прочитать репозиторий. Как передать Store? Поскольку все эти типы зависят от параметров запуска, я не могу (или не знаю, как) определить эти модули где-либо еще, и все мои попытки передать или определить Store где-либо еще потерпели неудачу с ошибками в конструкторе, которые могли бы избежать их прицелы. Мне удалось создать собственный файл store.ml (как в Canopy), но он просто переносит проблему на новый модуль, я до сих пор не знаю, как его передать.
В навесе они, кажется, используют модуль Store исключительно из функции запуска, что для их цели хорошо, но не для того, что я хочу сделать.
Я пытаюсь использовать Irmin, но я предполагаю, что это не проблема Irmin, я, вероятно, просто очень ошибаюсь относительно того, как система модулей работает в ocaml. Когда я пытаюсь передать его другой функции или модулю, я получаю такие ошибки, как
The signature for this packaged module couldn't be inferred.
Что кажется логичным, но я не знаю, как это исправить.
Спасибо
1 ответ
Первоклассные модули (например, let (module Context)
) немного сложны в обращении для компилятора OCaml, и, в частности, он часто не может самостоятельно определить их тип.
Решение состоит в том, чтобы добавить ручную аннотацию:
let (module Context : Irmin_mirage.CONTEXT) = Irmin_mirage.context (resolver, conduit) in
...