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