机器学习抽象数据类型

ML abstract data type

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

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

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

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

我想我应该在某处提到 Queue.queue 类型(假设它在签名 Queue 中的命名方式)...我应该打开 Queue 吗?这可以做到吗?这似乎应该是 ADT 的常见情况,但我不知道在哪里阅读...我只找到了如何定义 signatures/structures,而不是如何使用它们。

这就是 functors 的用武之地:您编写一个模块,并根据它使用的队列进行参数化:

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

然后您可以使用队列实现的特定选择来实例化此模块:

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

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