2015-05-30 153 views
2

我想在標準ML中使用抽象數據類型。例如,可以寫一個簽名隊列,並且通過定義兩種結構作爲隊列兩個隊列的實現:ML抽象數據類型

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) 

順便說一句,簽名名稱通常寫成全部大寫,以區別於結構。