のは、私はこのようになります関係の集合を持っているとしましょう:複雑なマージ
relations :: [(A, B)]
instance Monoid A
instance Monoid B
私はA
Sの関係とB
Sの新しいセットに関係のこのセットを変換したいです。そのB
のmappend
編を持っている必要があり等しい
A
S:は今、ここにトリッキーなものをしています。
B
は、A
smappend
edである必要があります。A
とB
が別々のものになるまで繰り返す(そうでない場合は、何らかの理由でこれをやり直すことができるかどうかによって異なります)。
EDIT:注文の制約により問題は些細なものになっていたので、削除しました。
Ord
,Hashable
など、必要なものはすべて利用可能です。すべての意図や目的のために、一つはA
がを振る舞う正確HashSet
とB
等が正確Vector
(または合理的なサイズのチェックといくつかの他のタイプ)などが動作することを言うことができます。
これは、など
この変換が起こる方法の例
[(<1>, [a]), (<4>, [d]), (<2>, [b]), (<5>, [e]), (<1>, [b]), (<2>, [a]), (<3>, [c])]
-- Merge `A`s for equal `B`s
[(<1,2>, [a]), (<4>, [d]), (<1,2> [b]), (<5>, [e]), (<3>, [c])]
-- Merge `B`s for equal `A`s
[(<1,2>, [a, b]), (<4>, [d]), (<5>, [e]), (<3>, [c])]
-- All values are distinct, so we're done.
これを行うことができますどのように(<a, b>
がSet.fromList [a, b]
であることをふり)1は、そのlet s = size (mappend a b); s >= size a; s >= size b
、そのa, b :: B; mappend a b /= mappend b a <=> a, b not mempty; a > b => (mappend a c) > b
を、想定することができることを意味しできるだけ効率的な方法で(時間、空間)?
「B」は、等価チェックを実行すると、かなりの順序でセットされたものとして扱われますが、正しいですか?私の特定の状況のためには(すべての 'B 'は追加されたときにソートされるので)、この質問は有益であるためには、[[1,2]/= [2,1]' – jberryman
@jberryman他には、 'インスタンスイクB'があると言って、それをそのまま残しておくといいかもしれません。 – dflemstr
プロシージャの順序(1.)と(2.)は重要です。これらの規則を適用する順序が異なると、異なる結果につながります。それはどのように動作するはずですか? (1.)、次に(2.)、(1.)、(2.)のいずれのルールも適用されなくなるまで、すぐには適用できません。 –