我正在尝试在标准机器学习中使用抽象数据类型。例如,我可以通过定义两个结构体作为队列来编写一个签名队列和两个队列实现:
signature Queue = ...
structure AQueue :> Queue = ...
structure BQueue :> Queue = ...
现在我想为队列编写通用函数/值,我使用哪个队列(AQueue 或 BQueue)并不重要。例如,我想编写以下内容:
val double1 = Queue.enqueue (1, Queue.enqueue (1, Queue.empty))
我想我应该在某个地方提到 Queue.queue 类型(假设它的命名与签名队列中的那样)...我应该打开队列吗?这可以做到吗?这看起来应该是 ADT 的常见情况,但我不知道在哪里阅读...我发现的只是如何定义签名/结构,而不是如何使用它们。
最佳答案
这就是仿函数的用武之地:您编写一个由它使用的队列参数化的模块:
functor Client(Queue : QUEUE) =
struct
val double1 = Queue.enqueue (1, Queue.enqueue (1, Queue.empty))
...
end
然后您可以使用队列实现的特定选择来实例化此模块:
structure AClient = Client(AQueue)
structure BClient = Client(BQueue)
顺便说一句,签名名称通常全部大写,以区别于结构。
关于sml - 机器学习抽象数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30551860/