Haskell создает дополнительные экземпляры для импортированных типов данных

Я относительно новичок в Haskell. Пишу клон карточной игры uno и хочу красиво раскрасить карту. Я делаю

import System.Console.ANSI

который обеспечивает

data Color = Black
           | Red
           | Green
           | Yellow
           | Blue
           | Magenta
           | Cyan
           | White
           deriving (Bounded, Enum, Show)

теперь я также хочу добавить вывод (Ord, Eq), я мог бы написать это в исходном файле импортированного пакета, но должен быть более простой способ сделать это. я понятия не имею, какие ключевые слова искать в Google или искать в книге.


person epsilonhalbe    schedule 30.04.2011    source источник


Ответы (1)


Нет необходимости редактировать библиотеку. В исходном файле укажите:

instance Eq Color where
  x == y  =  fromEnum x == fromEnum y

instance Ord Color where
  compare x y  =  compare (fromEnum x) (fromEnum y)

Объяснение: fromEnum — это функция для Enum, которая возвращает int (Black -> 0, Red -> 1 и т. д.). Целые числа, очевидно, сравнимы по равенству и упорядочены.

Редактировать: версия @rampion в комментариях явно красивее:

instance Eq Color where
  (==)  =  (==) `on` fromEnum

instance Ord Color where
  compare  =  compare `on` fromEnum
person Fred Foo    schedule 30.04.2011
comment
Для класса чтения я добавил следующие строки instance Read Color where¬ readsPrec _ str = [(color (c), t) |¬ (c, t) ← reads str]¬ where color x = case x of "Black" → Black¬ "Red" → Red¬ "Green" → Green¬ "Yellow" → Yellow¬ "Blue" → Blue¬ ... - person epsilonhalbe; 30.04.2011
comment
Использование import Data.Function (on): instance Eq Color where (==) = (==) `on` fromEnum, instance Ord Color where compare = compare `on` fromEnum. - person rampion; 30.04.2011
comment
Разве он не может использовать автономный вывод для автоматического вывода Ord и Eq? haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations - person Rafael S. Calsaverini; 30.04.2011
comment
С расширением GHC, не помню каким, вы можете сказать deriving instance Eq Color и получить поведение deriving(..) - person luqui; 30.04.2011
comment
@Rafael: я стараюсь не использовать расширения GHC без необходимости и, конечно же, не обучаю им начинающих пользователей. - person Fred Foo; 30.04.2011