У меня есть тип, определенный следующим образом:
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
требует * -> *
)