4

このデータ型があり、等値演算子を定義したいと考えています。Mlist は Eq のインスタンスでなければなりません。

data Mlist a = Mlist [a]

instance Eq a => Eq (Mlist a) where
    (==) :: [a] -> [a] -> Bool

等値演算子を使用すると、これを確認できます (さらに、順序は重要ではありません)。

m1 = Mlist [1,2,3]
m2 = Mlist [3,1,2]
-- then m1 equals m2
m3 = Mlist [3,2,1,5]
-- then m1 not equals m3

トップコードが機能していません。誰か助けてもらえますか?

編集:これは新しいバージョンですが、機能していません...

instance Eq a => Eq (Mlist a) where
    (==) :: (Eq a) => [a] -> [a] -> Bool
    (==) [] [] = True
    (==) [] _ = False
    (==) _ [] = False
    (==) (hd:tl) b = (==) tl $ delete hd b
4

2 に答える 2

9

Mlist aのインスタンスを作成するにはEq、次のいずれかを定義する必要があります

(==) :: Mlist a -> Mlist a -> Bool

また

(/=) :: Mlist a -> Mlist a -> Bool

要するに、2 つのリストが等しいかどうかを判断できる関数を実装する必要があります。が唯一の制約であるためEq、 のヘルプを使用できますData.List.\\。例えば:

instance Eq a => Eq (Mlist a) where
    Mlist xs == Mlist ys = length xs ==  length ys && null (xs \\ ys)
于 2013-03-10T06:52:37.137 に答える
0

あなたの編集に対処するには:インスタンス宣言には型シグネチャが必要ないため、新しいバージョンは機能しません。型シグネチャはクラスによって与えられます。

hdis not inのケースを考慮していないため、コードはまだ正しくありませんb。その場合、delete hd bは だけbなので、特にtl == bを返すTrue場合は、本当に を返す必要がありましたFalse

于 2013-03-10T12:15:59.000 に答える