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

#haskell #import #types #typeclass

#haskell #импорт #типы #класс типов

Вопрос:

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

 import System.Console.ANSI
  

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

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

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

Ответ №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
  

Комментарии:

1. Для класса read-typeclass я добавил следующие строки 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¬ ...

2. Используя import Data.Function (on) : instance Eq Color where (==) = (==) `on` fromEnum , instance Ord Color where compare = compare `on` fromEnum .

3. Разве он не может использовать автономное извлечение для автоматического получения Ord и Eq? haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations

4. С расширением GHC, я не помню, каким, вы можете указать deriving instance Eq Color и получить deriving(..) поведение

5. @Rafael: Я стараюсь не использовать расширения GHC без необходимости и, конечно же, не обучаю им начинающих пользователей.