#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 без необходимости и, конечно же, не обучаю им начинающих пользователей.