Разница между `with type` и функторами в OCaml - PullRequest
0 голосов
/ 26 апреля 2020

Предположим, следующий модуль:

module type A = sig
  type a
  type f = r:a -> unit Lwt.t
end

module type AA = A with type a = B.t

Не могу я сделать параметризованный модуль A (превратить его в функтор), который принимает B.t в качестве параметра?

module type A (b: B.t) = sig
  type f = r:b -> unit Lwt.t
end

module type AA = A(B.t)

Являются ли эти эквиваленты? Почему есть 2 способа сделать то же самое?

1 Ответ

3 голосов
/ 26 апреля 2020

Являются ли эти эквиваленты? Почему есть 2 способа сделать одно и то же?

Нет, и нет. Ваш «функтор» недействителен, что вы могли бы легко узнать, попробовав его самостоятельно.

Функторы и ограничения модуля (ie. with type ...) работают в разных областях. Функторы работают с реализациями, а ограничения модуля работают с сигнатурами / типами. Кроме того, ограничения модуля берут существующую сигнатуру и добавляют к ней информацию (ограничение), в то время как функторы принимают реализацию модуля в качестве параметра, но не расширяют ее или нуждаются во входных и выходных сигнатурах, чтобы вообще иметь какое-либо отношение друг к другу. .

Вы можете использовать функтор для общего расширения реализаций , используя include, как описано выше. Но так как подпись аргумента является stati c, его повторное использование и, следовательно, его полезность ограничены:

module A (B1: B) = struct
  include B
  let x = 42
end
...