Haskell: создание экземпляра Show для алгебраического типа

#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, а обычные алгебраические типы данных.