Haskell получает дополнительные экземпляры для импортированных типов данных - PullRequest
5 голосов
/ 30 апреля 2011

Я относительно новичок в Хаскеле. Я пишу клон карточной игры Uno, и я хочу довольно цветной вывод карты. Я делаю

import System.Console.ANSI

, что обеспечивает

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

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

1 Ответ

4 голосов
/ 30 апреля 2011

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

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
...