2015-03-13 2 views
1
data Set a = Set [a] 
member xs x = elem x xs 
subset xs ys = and (map (member ys) xs) 

instance (Eq a) => Eq (Set a) where 
    (Set xs) == (Set ys) = (subset xs ys) && (subset ys xs) 

class Ord a => Comparable a where 
    cmp :: a -> a -> String 
    cmp x y 
    | x == y = "eq" 
    | otherwise = "neq" 

instance Comparable a => Comparable (Set a) where 
    cmp (Set xs) (Set ys) 
    | (Set xs) == (Set ys) = "same" 
    | otherwise   = "different" 

Я получаю следующее сообщение об ошибке:Haskell - Compile Error

Не удалось вывести (Ord (Установить)) вытекающий из суперклассов в объявлении экземпляра из контекста (Сопоставимые а) связанный декларацией экземпляра для «Comparable (Set a)»

Хотелось бы узнать, что это за ошибка? Спасибо.

ответ

1

Эта декларация

class Ord a => Comparable a where 

утверждает, что каждый член класса Comparable должен быть членом класс Ord. Если бы я попытался делать

data MyType = ... 
instance Comparable MyType where 
    cmp x y = "hello" 

компилятор будет жаловаться, что экземпляр Ord MyType отсутствует. Не имеет значения, что я ничего не использую из этого экземпляра Ord: это требуется по определению Comparable.

Чтобы исправить это, добавьте экземпляр

instance Ord a => Ord (Set a) where 
    compare setA setB = .... 

После этого, вы можете использовать свой Comparable экземпляр, при условии добавления Ord a к ограничениям.

instance (Ord a , Comparable a) => Comparable (Set a) where 
    cmp (Set xs) (Set ys) 
    | (Set xs) == (Set ys) = "same" 
    | otherwise   = "different" 
+0

В этом случае вы также можете просто удалить ограничение 'Ord' в свой класс' Comparable'. –

+0

@ChrisEmerson Правда, но я не был уверен в том, что нужно OP, поэтому я покинул класс, когда он был опубликован. – chi

1

Comparable является подклассом Ord поэтому вам нужно добавить экземпляр Ord (Set a) например:

instance Ord a => Ord (Set a) where 
    compare (Set s1) (Set s2) = 
    compare (sort s1) (sort s2) 
0

Вы указали экземпляр Equality на свой заданный тип данных, но у него нет экземпляра Ord. Когда вы пытаетесь сделать Set и экземпляр класса Comparable, это требует, чтобы Set был экземпляром Ord.