2つの順序付けられていないマルチセットが等しいかどうかを2回チェックしています。 ...初心者のHaskellのマルチセットの等価性
私はただ一つの関数にそれらを組み合わせたりiEqual内allsort呼び出す方法を知らないiEqual :: (Eq a) => [a] -> [a] -> Bool
iEqual [] [] = True
iEqual (x:xs) (y:ys) = x == y && iEqual xs ys
iEqual _ _ = False
:
allsort :: (Ord a) => [a] -> [a]
allsort [] = []
allsort (x:xs) =
let smallerSorted = allsort [a | a <- xs, a <= x]
biggerSorted = allsort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ biggerSorted
と平等のチェック機能:
私はソート機能を持っています
次に、長さをチェックし、xがyのサブセットであるかどうかを確認します。
編集:私はそれを解決しました、ちょうど長さを比較し、そしてそれらがお互いのサブセットであり、それが機能するなら。あなたが任意のリストから、このようなセットを生成するが、それは常に注文の保証することができるようにしたい
newtype Multiset a = Multiset { getOrderedList :: [a] }
..
あなたは 'iEqual'を定義する必要はありません。 '[a]'はすでに 'Eq'のインスタンスです。 – chepner
@chepnerこれは、あなた自身の「iEqual」を定義するか、「私たちが授業でやったことを再利用する」ことを含む、運動/宿題/何でもよいかもしれません。 – chi
はいiEqual ::(Eq a)=> [a] - > [a] - > Bool – deathskiller