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 queuemkQueuetype の値で呼び出していますunit * unit:

Queue.mkQueue ((), ())

必要なキューのタイプに関係mkQueueなく、 (). 例を次に示します。これは新しいキューを作成し、それにいくつかの int のペアを追加します。

キューを作成します (値の制限により、REPL に型注釈を追加する必要がありました。コンパイルするソース ファイルでこれを行う必要はないかもしれませんが、よくわかりません)。

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

次に、次の 2 つを追加します。

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

それらを取り出し、定数とパターンマッチして、それが機能していることを確認します:

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

あなたのエラーメッセージは私には少し当惑しています。もちろんタプルではない#2関数から(タプルから2番目の要素を選択して)適用しようとしているようです。bfs1しかし、あなたのコードは適切に括弧で囲まれているので、そのメッセージの原因となった古いコードをロードしたのだろうか?

次のコードを新しい REPL に、コードの残りの部分と共にロードしてみてください (つまり、SML/NJ プロセスを完全に停止し、コードで新しいプロセスを開始します)。いくつかのコードが欠落しているため、これをテストするのは難しいです (変数cnarray1bfs1)

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