У меня есть тип, определенный следующим образом:
newtype PrimeSet a = P Integer
deriving Eq
Я также определил функцию, которая преобразует набор простых чисел в список, учитывая, что ее параметр типа — Integral
.
toList :: Integral a => PrimeSet a -> [a]
Теперь мне нужно дать PrimeSet
экземпляр Foldable
, так что это была моя первая попытка (после импорта fold
из Data.Foldable
):
instance Foldable PrimeSet where
foldMap f = fold . map f . toList
Однако это не сработало, и компилятор сказал мне, что это Could not deduce (Integral a) arising from a use of ‘toList’
. Насколько я понимаю это сообщение, toList
требует, чтобы его аргумент был типа Integral a => PrimeSet a
, но это не обязательно имеет место в экземпляре Foldable
.
В сообщении также говорилось, что возможным исправлением будет добавление Integral a
в контекст сигнатуры типа для моей реализации foldMap
, но, конечно, мне тогда сказали, что мне не разрешено предоставлять собственные определения типов для методов класса, если я не использую InstanceSigs
, поэтому я попробовал это, но это тоже не сработало.
Итак, мой вопрос заключается в следующем: можно ли добавить ограничение типа к экземпляру класса, если параметр типа того типа, для которого я пишу экземпляр класса, скрыт, или, повторюсь, могу ли я сделать что-то подобное?
instance (Integral a) => Foldable (PrimeSet a) where
(Конечно, это не работает, потому что PrimeSet a
имеет тип *
, тогда как Foldable
требует * -> *
)