Как бороться со всеми этими функторами

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

(С некоторыми неинтересными изменениями для проверки типа кода.)

Другие вопросы по тегам