2012-03-23 2 views
5

Что такое обычный способ создания интерфейса в OCaml? Возможно иметь интерфейс с одной реализацией, создав файл интерфейса foo.mli и файл реализации foo.ml, но как вы можете создать несколько реализаций для одного и того же интерфейса?Интерфейс с несколькими реализациями в OCaml

ответ

5

Если у вас будет несколько реализаций для одной и той же сигнатуры, определите свою подпись внутри единицы компиляции, а не как блок компиляции и (если необходимо) аналогично для модулей. Там пример того, что в стандартной библиотеке: 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) 
9

Вы должны использовать модули и подписи. Файл .ml неявно определяет модуль, а его подпись - .mli. С явными модулями и сигнатурой вы можете применить подпись к нескольким различным модулям.

См. this chapter онлайн-книги «Разработка приложений с OCaml».

+0

Большое спасибо за ссылку на книгу. Это было очень полезно во многих отношениях. –

Смежные вопросы