1

我正在用 ml 编写一个程序,我正在尝试创建一个由整数元组组成的队列。但它不起作用!这是我的代码。

let     
val fif1 = Queue.mkQueue (() ,()  )
in #2 (bfs1 (array1, 0, n, Queue.enqueue (fif1 , (c,0) ) ))
end  

其中 c 是一个整数。编译器错误是这样的:

Error: operator and operand don't agree [type mismatch]
operator domain: {2:'Y; 'Z}
operand:         square array * 'X * int * (int * int) Queue.queue
               -> square array * int * int * (int * int) Queue.queue
in expression:
(fn {2=2,...} => 2) bfs1

任何帮助都会非常有用!在此先感谢!

4

1 回答 1

1

我假设您在 SML/NJ 中使用 Queue 结构

简而言之,这是可变队列的实现。签名提供了mkQueue类型为 的构造函数unit -> 'a queue。您正在调用mkQueuetype 的值unit * unit

Queue.mkQueue ((), ())

无论您想要哪种类型的队列,都应该mkQueue使用(). 这是一个示例,它创建了一个新队列并向其中添加了一对整数:

构造队列(由于值限制,我不得不在 REPL 中添加类型注释,您可能不必在编译的源文件中执行此操作,我不确定)

val q = Queue.mkQueue () : (int * int) Queue.queue

然后在其中添加两件事:

val _ = ( Queue.enqueue (q, (1, 2))
        ; Queue.enqueue (q, (3, 4)))

把它们拿出来,用常量进行模式匹配以确认它正在工作:

val (1, 2) = Queue.dequeue q
val (3, 4) = Queue.dequeue q

您的错误消息让我有点困惑,看起来您正在尝试#2从 function 应用(从元组中选择第二个元素)bfs1,这当然不是元组。但是您的代码已正确括起来,所以我想知道您是否加载了一些导致该消息的旧代码?

尝试在新的 REPL 中加载以下代码以及其余代码(即完全停止 SML/NJ 进程并使用您的代码开始一个新进程)。otest 这对我来说很难,因为缺少一些代码(变量c, n, array1, bfs1

let
   val fif1 = Queue.mkQueue ()
in
   #2 (bfs1 (array1, 0, n, Queue.enqueue (fif1, (c, 0))))
end
于 2013-06-21T13:11:39.907 回答