Использование функторов в качестве интерфейсов в OCaml - PullRequest
8 голосов
/ 05 августа 2010

Я разрабатываю некоторые алгоритмы в OCaml, которые нуждаются в том, чтобы некоторые части были «подключаемыми», чтобы часть вычислений оставалась для конкретных вычислителей.one:

module type Algorithm = sig
    val feed : float -> unit
    val nth : int -> (float -> float)
end

И две разные реализации, которые будут Alg1 и Alg2.Этот модуль Algorithm должен представлять интерфейс для различных реализаций, подобных этим двум.

Теперь мне нужен еще один компонент, назовем его Executor, который будет модулем, использующим Alg1 или Alg2.их интерфейс ..

Читая о функторах, мне кажется, что мне нужен функтор, который принимает Algorithm и производит ConcreteExecutor с конкретной реализацией алгоритма, который мне нужен.Так что Executor является своего рода модулем, который параметризован по одному из его компонентов.

Я прав?Это лучший способ получить то, что мне нужно?Мне вот такие вот соображения, потому что я пришел из Java / C ++, поэтому я привык использовать интерфейсы и абстрактные классы, и мне нужно правильно разобраться с этой проблемой абстракции функтора / модуля.

Какой правильный синтаксис для получения того, что я хочу?

Заранее спасибо

1 Ответ

4 голосов
/ 05 августа 2010

Да, похоже, что функторы - это то, что вы хотите.Фактически, вы можете взглянуть на то, как стандартная библиотека использует функторы в качестве исходного кода.На моей машине он находится по адресу /usr/lib/ocaml/3.10.2/.Например, set.mli содержит следующее:

module type OrderedType =
  sig
    type t
    val compare : t -> t -> int
  end

module type S
  sig
    ...
  end

module Make (Ord : OrderedType) : S with type elt = Ord.t

Когда вы хотите использовать набор в OCaml, вы делаете:Alg1 / Alg2 заменяет String, Executor заменяет Make, а ConcreteExecutor является результатом Executor (Alg1 / Alg2).Вы также заметите, что string.mli / ml не содержит упоминания OrderedType.String является OrderedType, поскольку имеет тип t, который используется функцией сравнения.Вам не нужно явно указывать, что String является OrderedType.

...