Цель этой конкретной части кода - сделать функцию size
более эффективной, чем просто подсчет всех элементов в elems
. Я остановился на суммировании двух типов, составляющих список, но я не могу создать подпись функции размера.
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
Из Prelude мы знаем, что Either a b = Left a | Right b
.
Первое, что я пробовал, это совпадение Either
, но, конечно, это тип, так что это не работает. Затем я попробовал ((Left a) | (Right b))
, но так и не пошел. Ничто иное не похоже на тип Either a b
.
Мне удалось получить size (Left a)
для компиляции, но поскольку он не имеет компонента b
, я получаю сообщение об ошибке:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
что, конечно, имеет смысл в контексте, но я действительно не знаю, как сопоставить Either a b
.
У кого-нибудь есть мысли?