Переопределить метод show для String/Char в Haskell

У меня вопрос: как переопределить метод show для String или Char? Спасибо.


person Academia    schedule 19.11.2011    source источник
comment
Есть ли причина, по которой вы не хотите просто определять некоторые другие функции типа Char -> String или String -> String? Почему вы хотите переопределить show?   -  person hammar    schedule 19.11.2011
comment
Я думаю, вам нужно обернуть его в новый тип и определить Show для этого типа.   -  person Lily Ballard    schedule 19.11.2011


Ответы (2)


Если вы хотите сделать это, то вы делаете это неправильно.

По техническим причинам см. мой ответ на предыдущий вопрос.

Вам на самом деле следует использовать либо свои собственные функции a -> String (возможно, через собственный класс типов), либо использовать библиотеку для более подробного вывода (некоторые из них уже имеют встроенный класс Pretty).

person ivanm    schedule 19.11.2011

Поскольку людям нравится мой комментарий, вот он как ответ:

Если вы хотите повторно реализовать классы типов для существующих типов, вы можете обернуть их в объявленный newtype тип. Это позволяет вам определять свои собственные реализации без каких-либо фактических накладных расходов во время выполнения (поскольку newtype изоморфен исходному типу, фактическая упаковка во время выполнения не выполняется).

Это может выглядеть примерно так:

newtype MyChar = MyChar Char

instance Show MyChar where
  show (MyChar c) = "head \"" ++ c : "\""

Вы можете использовать это, обернув Chars с MyChar, например:

print $ fmap MyChar "test"

Это распечатает

[head "t",head "e",head "s",head "t"]
person Lily Ballard    schedule 19.11.2011
comment
Вы также можете определить showList, тогда списки MyChar также будут иметь собственное форматирование. Фактически, именно поэтому отображение списков символов ([Char]) ведет себя иначе, чем отображение других списков ([a]). - person sdcvvc; 21.11.2011