Вы пытаетесь сделать класс экземпляром класса, а не type экземпляром класса.Сравните:
Show a => Show (Bits a) -- Invalid
с
Show a => Show (Maybe a) -- Valid
, где Maybe
- это тип данных, тогда как Bits
- это имя класса.
Не знаюдумаю, что можно выразить «все, что имеет Bits
экземпляр, имеет Show
экземпляр», потому что это может привести к перекрывающимся экземплярам : если вы можете определить что-то подобное, то когда вы используете show :: Int -> String
компилятор не будет знать, использовать ли экземпляр Prelude Show Int
или show
, который будет определен как Int
, являющийся экземпляром Bits
.
Грязный обходной путь может бытьприменять «другое направление»: каждый экземпляр Bits
должен быть экземпляром Show
, что позволит вам использовать a
Show
экземпляр вместо своего собственного:
class (Show a, Eq a) => Bits a where
zer :: a
one :: a
main = print (zer :: Int)
хотя для этого требуется явная подпись типа для устранения неоднозначности в типе zer
на сайте вызова.