The purpose for this particular portion of code is to make the size function more efficient than simply counting all the elements in elems. I’ve settled on summing the two types that make up the list, but I can’t seem to create the signature of the size function.
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)
From Prelude, we know that Either a b = Left a | Right b.
The first thing I tried was to match Either, but of course it is a type, so that doesn’t work. Next, I tried ((Left a) | (Right b)), but no go on that either. Nothing else seems to match the type Either a b.
I was able to get size (Left a) to compile, but since it’s missing the b component, I receive the error:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
which of course makes sense in the context, but I really have no clue how to match Either a b.
Anybody have any thoughts?
Something of type
Either a bis either aLeft aor aRight b, so you have two cases that can be handled separately:The error about the ambiguous type variable is a separate issue.
If you just type something like
size (Left 1)into the interpreter, the system can’t deduce what the “right” type of thatLeft 1value would be. It could beEither Int anythingand as long as it is not known what type thatanythingis, it cannot be checked if it is in classFinite(which is required bysize).You can avoid that problem by specifying an explicit type signature: