2011-12-29 7 views
0

下のコードを参照してください。エラーの内容はかなりわかりましたが、キーがタプルのときにアンダースコアを使用してPSQを照会する簡単な方法があるかどうかは疑問です。少なくともそれは非常に魅力的に見える:D。Data.PSQueue:式コンテキスト内のパターン構文:_

main :: IO() 
main = do 
    time <- getCPUTime 
    let qTuple = ("mine", 3455, msgs) 
    let rrq = PSQ.singleton qTuple time 
    let r = PSQ.lookup ("mine", _, _) rrq 
    print (r) 

結局私は、IPv4アドレスとその作成日時順に(しばらくして)キューイングを解除する必要があるTCPポート番号宛てのメッセージがあります(IPv4の、tport)、(MSG、CTIMEを)。一方では、任意のタプル(IPv4、tport)のキューが存在しているかどうかを問い合わせることができます。必要に応じてこのようなキューを作成するか、期限切れにする必要があります。

答えて

1

PSQでそのフォームの後に続くタプルを参照するような構文を使用できるかどうかを尋ねるなら、答えはいいえです。一般的に、すべてのデータ構造に対してこれを行うことは不可能ですが、結局。

アイテム(アイテム自体に保存されている)に一意の識別子(番号は何ですか?)を割り当てて、その上にPSQをキーする必要があります。あなたはインデックスに気を付けるフィールド(文字列、整数など)をアイテムに適用してMapを指定することができます。それ以降は優先順位を得るための別の検索です。もちろん、一意の識別子から項目自体まで、少なくともMapが必要です。

(これらは、あなたのolder questionで述べた同じタプルであればところで、私が代わりにタプルのデータ型を使用してお勧めします。)

+0

何をあなたの例では、優先度になると、何がキーになります?この場合、タプルは優先度を表していると私は理解していますか?キューから取り除かれる順序は何ですか? –

+0

おっと - 私はPSQがマップではないことを忘れていました。 – ehird

+0

しかし、自分のデータ型を定義しておけば、その中に優先度を入れ、 'compare = comparison priority'のような' Ord'インスタンスを与えることができます。これにより、PSQルックアップからデータ型全体を取得できるようになりますが、一部の人は 'a == b'を持つことに反対しますが、' b == EQを比較しません。 – ehird