Ниже приведен полиморфный тип данных в Haskell, интерпретируемый Хагсом. Я пытаюсь создать экземпляр Show for Equality.
Объявление экземпляра говорит, что если тип "a" находится в Show, тогда равенство a находится в Show. Он должен вывести два аргумента в конструктор Equals a b в форме "a = b".
data Equality a = Equals a a
instance (Show a) => Show (Equality a) where
show (Equals a b) = a ++ " = " ++ b
Тем не менее, введя что-то в Hugs наподобие "(Equality 9 9)", вы получите:
ОШИБКА - переполнение стека C
Итак, я попытался сделать отступ в строке "show (Equals a b) ..." с парой пробелов). Я не уверен, какая будет разница, но просто поигрался и получил:
Inferred type is not general enough
*** Expression : show
*** Expected type : Show (Equality a) => Equality a -> String
*** Inferred type : Show (Equality [Char]) => Equality [Char] -> String
Может кто-нибудь объяснить, почему происходят эти ошибки, или предложить лучший способ реализации этого экземпляра шоу?
Спасибо!