ML抽象数据类型

时间:2015-05-30 22:08:30

标签: sml ml abstract-data-type

我正在尝试在Standard ML中使用抽象数据类型。例如,我可以通过将两个结构定义为队列来编写签名Queue和两个队列实现:

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

现在我想为队列编写通用函数/值,我使用哪个队列(AQueue或BQueue)并不重要。例如,我想写下以下内容:

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

我想我应该提到Queue.queue类型(假设它的名字就像在签名队列中那样命名)某个地方......我应该打开Queue吗?可以这样做吗?这看起来应该是ADT的仙女常见情况,但我不知道在哪里阅读...我发现的只是如何定义签名/结构,而不是如何使用它们。

1 个答案:

答案 0 :(得分: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)

顺便说一句,签名名称通常是全部大写的,以区别于结构。