2015-05-30 2 views
2

Я пытаюсь использовать абстрактные типы данных в стандартном ML. Например, я мог бы написать очереди подписи, и две очереди реализаций пути определения двух структур в очередях:ML abstract data type

signature Queue = ... 
structure AQueue :> Queue = ... 
structure BQueue :> Queue = ... 

Теперь я хотел бы написать общие функции/значение для очередей, что это не имеет значения, какая очередь Я использую (AQueue или BQueue). Например, я хотел бы написать следующее:

val double1 = Queue.enqueue (1, Queue.enqueue (1, Queue.empty)) 

Я думаю, что я должен упомянуть тип Queue.queue (assumming он назван так в очереди подписи) где-то ... Я должен открыть очереди? Это можно сделать? Похоже, что это должна быть обычная ситуация с ADT, но я не знаю, где читать ... все, что я нашел, - это как определить сигнатуры/структуры, но не как их использовать.

ответ

4

Вот где функторы бывают: вы пишете модуль параметризованный, по которому очередь он использует:

functor Client(Queue : QUEUE) = 
struct 
    val double1 = Queue.enqueue (1, Queue.enqueue (1, Queue.empty)) 
    ... 
end 

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

structure AClient = Client(AQueue) 
structure BClient = Client(BQueue) 

Кстати, имена подписи обычно пишутся все-шапки, чтобы отличить их от структур.