#haskell #types
#haskell #типы
Вопрос:
У меня есть тип данных:
data Posn a = Posn Int Int a
Я хочу создать для него пользовательский экземпляр Show, который отображает два целых числа в виде упорядоченной пары, вот так:
showPosn :: Show a => Posn a -> String
showPosn (Posn l c x) = show (l,c) (' ' : show x)
Я пробовал это:
instance Show (Show a => Posn a) where
show = showPosn
но это выдает мне ошибку «Недопустимое объявление экземпляра».
Что расстраивает, так это то, что deriving Show
работает просто отлично. Итак, мой вопрос к вам: что мне нужно сделать, чтобы получить мой экземпляр Show?
Комментарии:
1. Совершенно естественно допускать такого рода ошибки во время обучения; тем не менее, из этого я могу сказать, что вы довольно новичок в языке. Создание языка — отличный способ изучить Haskell, я просто рекомендую сохранять непредвзятость, а не пытаться исправить это, прежде чем вы что-либо узнаете об этом.
2. @luqui Спасибо за спокойный, терпимый ответ. Я задал этот вопрос после поздней ночи кодирования, так что, полагаю, мое разочарование было очевидным. И да — я вроде как новичок в Haskell. Я увлекаюсь Lisp и совсем недавно увлекся теорией типов.
3. Кроме того, если вы считаете, что система типов Haskell является более или менее «поврежденным DTP», вы можете попробовать Agda или Idris после ознакомления с Haskell.
Ответ №1:
Все в порядке, у вас просто синтаксис немного неправильный:
instance (Show a) => Show (Posn a) where
show = showPosn
Кстати, это не GADTs, а обычные алгебраические типы данных.