Способ передать «этот» экземпляр модуля - PullRequest
0 голосов
/ 20 октября 2018

Используя мираж, у меня довольно большой функторный беспорядок.Пытаясь немного его очистить, я создал большой уродливый Context модуль, параметризованный по всем типам и значениям, которые мне нужно передать в моем коде.Поскольку, очевидно, передача только тех значений, которые мне нужны, позволила бы типам «выходить из области видимости» в кавычках компилятора, я просто передаю этот модуль в качестве аргумента функциям fun x (module Ctx : Context) ... =

Немного раздражает, но использоватьоно работает.Итак, в основном:

let module Context = MkContext(S)(C)(ContextConfig) in
S.listen_tcpv4 stackv4 ~port:8442 (Context.handleConnection console);

Внутри Context.handleConnection мне нужно вызвать функцию, которая принимает Context в качестве аргумента.Один из способов сделать это, я полагаю, состоит в том, чтобы передать Context в handleConnection, например, так:

S.listen_tcpv4 stackv4 ~port:8442 (Context.handleConnection console (module Context));

, а затем передать его из handleConnection как this функциям, которым это необходимо, но я предполагаю, что должен бытьлучший способ?

РЕДАКТИРОВАТЬ: Даже не могу этого сделать, мне нужно, чтобы тип модуля был рекурсивным, что не кажется тривиальным.

1 Ответ

0 голосов
/ 21 октября 2018

Я не уверен, что это хорошая идея, но можно определить рекурсивные типы модулей с помощью рекурсивных модулей:

module rec R: sig 
  module type S = sig
    val f: (module R.S) -> int -> int
  end
 end = R

Мы используем здесь трюк, который добавляет компоненты уровня типа во времярекурсивное расширение модуля, чтобы избежать некоторых повторений.Без этого трюка, вероятно, лучше начать определение типа внутреннего модуля с заполнителя self type

   module type I = sig
     type self
     val f: self -> int -> int
   end

Затем мы можем удалить тип заполнителя во время рекурсивного определения:

  module rec R : sig
    module type S = I with type self := (module R.S)
  end = struct
    module type S = I with type self := (module R.S)
  end

Наконец, мы можем использовать рекурсивный тип модуля с

module X = struct
    let f (module Self: R.S) n =
      if n = 0 then 1 else n * Self.f (module Self) (n-1)
end
let six = X.f (module X) 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...