我正在用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
任何帮助都非常有用!提前感谢!
答案 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进程并使用您的代码启动新进程)。这对我来说很难,因为缺少一些代码(变量c
,n
,array1
,bfs1
)
let
val fif1 = Queue.mkQueue ()
in
#2 (bfs1 (array1, 0, n, Queue.enqueue (fif1, (c, 0))))
end