Используя функторы как интерфейсы в OCaml

Я разрабатываю некоторые алгоритмы в OCaml, которым нужны некоторые части, чтобы быть "сменными" так, чтобы часть вычисления оставили определенному computators.

Только, чтобы заставить пример предположить у меня есть подпись как этот:

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

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

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

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

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

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

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

8
задан Jack 5 August 2010 в 15:16
поделиться

1 ответ

Ага, похоже, функторы - это то, что вам нужно. Фактически, вы можете посмотреть, как стандартная библиотека использует функторы, когда доступен исходный код. На моей машине он находится по адресу /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, вы делаете:

module SSet = Set.Make(String);;

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

4
ответ дан 6 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: