Что такое обычный способ создания интерфейса в OCaml? Возможно иметь интерфейс с одной реализацией, создав файл интерфейса foo.mli
и файл реализации foo.ml
, но как вы можете создать несколько реализаций для одного и того же интерфейса?Интерфейс с несколькими реализациями в OCaml
ответ
Если у вас будет несколько реализаций для одной и той же сигнатуры, определите свою подпись внутри единицы компиляции, а не как блок компиляции и (если необходимо) аналогично для модулей. Там пример того, что в стандартной библиотеке: OrderedType
подпись, которая описывает модули с типом и функцией сравнения на этом типе:
module type OrderedType = sig
type t
val compare : t -> t -> int
end
Эта подпись определяется как set.mli
и map.mli
(Вы можете обратиться к нему либо Set.OrderedType
, либо Map.OrderedType
, либо даже напишите сами: подписи являются структурными). В стандартной библиотеке есть несколько единиц компиляции, которые имеют эту подпись (String
, Nativeint
и т. Д.). Вы также можете определить свой собственный модуль, и при определении модуля вам не нужно делать ничего особенного: до тех пор, пока он имеет тип с именем t
и значение, называемое compare
типа t -> t -> int
, модуль имеет эту подпись. В стандартной библиотеке есть несколько сложный пример: функтор Set.Make
создает модуль, который имеет подпись OrderedType
, поэтому вы можете создавать наборы множеств таким образом.
(* All four modules passed as arguments to Set.Make have the signature Set.OrderedType *)
module IntSet = Set.Make(module type t = int val compare = Pervasives.compare end)
module StringSet = Set.Make(String)
module StringSetSet = Set.Make(StringSet)
module IntSetSet = Set.Make(IntSet)
Вы должны использовать модули и подписи. Файл .ml
неявно определяет модуль, а его подпись - .mli
. С явными модулями и сигнатурой вы можете применить подпись к нескольким различным модулям.
См. this chapter онлайн-книги «Разработка приложений с OCaml».
- 1. Интерфейс с несколькими реализациями в ninject
- 2. Один интерфейс с несколькими реализациями в Delphi
- 3. Ninject: связать интерфейс с несколькими реализациями
- 4. Связать интерфейс с несколькими конкретными реализациями с аргументом конструктора
- 5. Цель инъекции интерфейса с несколькими реализациями
- 6. Инъекция Java-зависимостей с несколькими реализациями
- 7. Служба WCF с несколькими реализациями зависимостей
- 8. Повторное использование тестовых наборов с несколькими реализациями?
- 9. OCaml Подпись с несколькими типами
- 10. Laravel 4 Один интерфейс с несколькими реализациями в одно и то же время
- 11. Как создать интерфейс в VB.NET с неявными реализациями
- 12. Как добавить интерфейс с реализациями делегатов в класс?
- 13. функторов с несколькими аргументами в OCaml
- 14. Конфигурация Maven между несколькими реализациями плагинов
- 15. Как использовать Ninject & MVC с несколькими реализациями одного интерфейса?
- 16. Связывание с несколькими конкретными реализациями с каркасами IOC?
- 17. OCaml - как увидеть интерфейс модуля?
- 18. Как использовать List.fold_left ocaml с несколькими аргументами?
- 19. Как использовать Guice AssistedInject с несколькими реализациями интерфейса?
- 20. Как использовать квалификаторы CDI с несколькими реализациями классов?
- 21. Условная инъекция пружинных компонентов для поля с несколькими реализациями
- 22. Зависимость от зависания замка Виндзор с несколькими конкретными реализациями
- 23. Unity Decorator Extension не работает с несколькими реализациями
- 24. Как получить указатель метода класса с несколькими реализациями этого метода?
- 25. Несколько Lifecycles для одного интерфейса с несколькими реализациями
- 26. Интерфейс Swagger с несколькими службами
- 27. Интерфейс с несколькими определениями C#
- 28. Как создать тип с несколькими параметрами в OCaml?
- 29. Ожидаемый интерфейс и общий «интерфейс» с несколькими границами
- 30. подклассов с различными реализациями массива
Большое спасибо за ссылку на книгу. Это было очень полезно во многих отношениях. –