Как бороться со всеми этими функторами
Я был здесь ради чего-то другого, но пытаясь написать свой вопрос, я понимаю, что я никак не могу сделать это правильно. Я некоторое время использую mirage и irmin, и пока весь код остается в главном модуле, все отлично. Но, конечно, он быстро превращается в смехотворно огромный файл, и попытка разбить его на модули сводит меня с ума из-за того, что типы выходят за пределы области видимости и так далее.
Вместо того, чтобы просто передать консоль из начала в некоторые другие функции, я должен поместить эти другие функции в функтор, который будет принимать Mirage_types_lwt.CONSOLE
а также фактическую консольную переменную, что означает, что все заканчивается тем, что в функторах создается с начала и передается в нечитаемом коде.
У меня проблемы с созданием гигантского уродливого модуля для простого хранения и передачи всего этого (чтобы "изолировать" части, которые нуждаются в этом беспорядке, от обычного кода), и я не могу понять, как объявить что-то вроде этого:
module type ContextConfig = sig
module Store
val clientctx : Client.ctx
....
end
let mkContextConfig (module Store : Repo) ctx =
(module struct
(module Store : Repo)
let clientctx = ctx
end : ContextConfig)
(Репо - это модуль, который я сделал, чтобы обернуть вокруг функторы Ирмина). Это, очевидно, не работает, и я пробовал так много синтаксисов, что, я полагаю, это просто невозможно, это значит, что я делаю что-то очень неправильно?
Я хотел бы получить совет о том, как правильно обращаться со всеми этими функторами и типами, как я могу обойти такие вещи, как консоль или канал, без необходимости функторизовать и создавать все экземпляры в модуле Main, просто чтобы передать его. вокруг после?
1 ответ
Возможны такие определения:
module type REPO = sig end
module type CONTEXT_CONFIG = sig
module Store : REPO
val client_ctx : int
end
let mkContextConfig (module Store : REPO) ctx =
(module struct
module Store = Store
let client_ctx = ctx
end : CONTEXT_CONFIG)
(С некоторыми неинтересными изменениями для проверки типа кода.)