我怎样才能以ml为单位排队

时间:2013-06-13 18:18:57

标签: queue ml

我正在用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

任何帮助都非常有用!提前感谢!

1 个答案:

答案 0 :(得分:1)

我假设您使用的是Queue structure in SML/NJ

非常简单,这是可变队列的实现。签名提供构造函数mkQueue,其类型为unit -> 'a queue。您使用mkQueue类型的值调用unit * unit

Queue.mkQueue ((), ())

无论您想要什么类型的队列,都应该使用mkQueue来呼叫()。这是一个例子,它创建了一个新队列并为其添加了几对int:

构造队列(由于值的限制,我不得不在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应用bfs1(从元组中选择第二个元素),这当然是不是一个元组。但是你的代码是正确的括号,所以我想知道你是否加载了导致该消息的旧代码?

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

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