Когда у нас есть Foldable T
, T
должен быть параметрическим типом, то есть мы должны иметь возможность формировать типы T Int
, T String
и т. Д.
ВНа Haskell мы пишем T :: * -> *
для «типа, параметризованного над типом», поскольку он напоминает функцию от типов к типам. Синтаксис * -> *
называется kind of T
.
В вашем случае Row
не параметризован, это простой тип, что-то вроде *
,не * -> *
. Итак, Foldable Row
- добрая ошибка. В некотором смысле, складываемый объект должен быть универсальным контейнером, подобным списку, а не тем, в котором есть только Field
, как в вашем случае.
Вы можете вместо этого определить data Row a = Row [a]
и использоватьRow Field
когда вам нужен конкретный случай.
В качестве альтернативы, вы можете попробовать MonoFoldable Row
из пакета mono-traversable
, но учтите, что это более продвинутый вариант, включающий семейства типов. Не пренебрегайте этим путем, прежде чем рассматривать его последствия. В конечном итоге все сводится к , почему вам нужен Foldable
экземпляр.