Отступы имеют значение. Тело объявления экземпляра должно иметь отступ, иначе оно интерпретирует ваше определение show
как просто еще одну функцию верхнего уровня, поэтому Poker.show
работает.
instance Show Card where
show card = ...
Общее правило отступа в Haskell заключается в том, что если две последовательные строки имеют одинаковый отступ, то это два разных определения, тогда как если строка имеет более отступ, чем предыдущая, она считается частью предыдущего определения или выражение, которое вы хотите в этом случае.
Причина, по которой это вызывает бесконечный цикл, заключается в том, что, поскольку вы не предоставили реализацию show
в классе типов, она использует реализацию по умолчанию, которая косвенно вызывает showsPrec
. Так как вы также не предоставили его, он использует реализацию по умолчанию, которая вызывает show
. Таким образом, вы получаете бесконечный цикл. Несколько классов типов имеют реализации по умолчанию, реализованные в терминах друг друга, поэтому вам нужно реализовать только их подмножество.