Переполнение стека GHCI в экземпляре Show MyType

Почему я получаю переполнение стека, пытаясь сделать это в GHCI (версия 7.6.2)? Как я могу получить экземпляр класса типов во время сеанса GHCI или почему это невозможно?

*Main> data T = T Int
*Main> let t = T 42
*Main> instance Show T
*Main> t
*** Exception: stack overflow

Я знаю, что могу использовать deriving Show в объявлении типа, но этот трюк был бы полезен для проверки типов, загруженных из файлов.


person Dmytro Sirenko    schedule 05.06.2013    source источник


Ответы (1)


Вам нужно реализовать хотя бы один из show или showsPrec, чтобы экземпляр работал. В классе есть реализации по умолчанию show с использованием showsPrec (через shows) и showsPrec с использованием show:

showsPrec _ x s = show x ++ s
show x          = shows x ""

а также

shows           =  showsPrec 0

so

instance Show T

создает экземпляр цикла. Звонок show вызывает showsPrec, который звонит show, который...

С языковым расширением StandaloneDeriving вы можете

ghci> :set -XStandaloneDeriving
ghci> deriving instance Show T

получить экземпляр в приглашении.

person Daniel Fischer    schedule 05.06.2013
comment
Добавлено, как вы можете получить экземпляр в приглашении. Вы не можете сделать это проще, чем это, насколько я знаю. - person Daniel Fischer; 05.06.2013
comment
Вы можете сделать макрос :def doShow \typeName -> return $ ":set -XStandaloneDeriving\nderiving instance Show " ++ typeName (вероятно, в свой файл .ghci), тогда нужно только написать Prelude>:doShow T :D - person josejuan; 05.06.2013