Бесконечный цикл при попытке определить экземпляр Show для типа данных - PullRequest
2 голосов
/ 21 ноября 2011

У меня установлен модуль с типом данных Card. Я делаю это экземпляром класса Show, но что-то идет не так в ghci:

 module Poker where

 data Card = Card Int 

 ...

 instance Show Card where
 show card = ...

 ...

Я открываю ghci и набираю:

>:m + Poker
>Card 0
..
..
..
(Nothing) => I stop the execution
>Poker.show (Card 0)
> "Ace of Hearts"

Кажется, что мой тип данных не является экземпляром класса Show, почему?


Спасибо всем! Оно работает! :)

1 Ответ

5 голосов
/ 21 ноября 2011

Отступы имеют значение. Тело объявления экземпляра должно иметь отступ, иначе оно интерпретирует ваше определение show как просто еще одну функцию верхнего уровня, поэтому Poker.show работает.

instance Show Card where
    show card = ...

Общее правило отступа в Haskell заключается в том, что если две последовательные строки имеют одинаковый отступ, то это два разных определения, тогда как если строка имеет более отступ, чем предыдущая, она считается частью предыдущего определения или выражение, которое вы хотите в этом случае.

Причина, по которой это вызывает бесконечный цикл, заключается в том, что, поскольку вы не предоставили реализацию show в классе типов, она использует реализацию по умолчанию, которая косвенно вызывает showsPrec. Так как вы также не предоставили его, он использует реализацию по умолчанию, которая вызывает show. Таким образом, вы получаете бесконечный цикл. Несколько классов типов имеют реализации по умолчанию, реализованные в терминах друг друга, поэтому вам нужно реализовать только их подмножество.

...