Deprecate Foldable for Either

Anthony Clayden anthony_clayden at
Thu Mar 23 10:18:32 UTC 2017

> On Thu Mar 2 16:30:21 UTC 2017 Henning Thielemann wrote:

>> On Thu, 2 Mar 2017, Andreas Abel wrote:

>> Today a student came to me wondering why a certain
>> produced a regular result, where he had expected an
>> Turned out he had used `concat`, but not on a lists of
>> as he had thought, but on a lists of `Either a [b]`.

> That is, he did (concat (xs :: [Either a [b]]))? 
> Does GHC actually accept that?
> If at all, it would not have to do with Foldable.

Good questions Henning. They've got swamped.
I found Andreas' description a bit unclear.

We have:
    concat :: Foldable t => t [a] -> [a]

So the `concat` you put above would give an error.

To get a result, the student must have put
    (concat (xs :: Either a [b]))
And got result either `[]` from (Left _)
or a genuine List from (Right ys).

Either way, I'd be grumpy: this hasn't and couldn't
concatenate anything.

Two thoughts:
1) The FTP hasn't done a very thorough job.
     Why is `[a]` hard-coded in the signature for concat?
     I would expect anything specific to Lists to be
    concat :: (Foldable t1, Foldable t2) => t1 (t2 a) -> t2

2) It's obvious why FTP didn't go that far:
     (concat (xs :: [Either a [b]])) -- as you speculated --
would be daft.
     concat only applies for structures that can be
     But that surely includes more than Lists(?)
     So this is essentially the same complaint as for
     Why have an instance of Foldable which always returns
length 1?
     (Or for some instances returns length 0 or 1.)

`concat` and `length` should not be in Foldable.
They should be in a separate class `Consable` (say),
which would be a sub-class of Foldable.

Note that `length` used not to be in Foldable.
`concat` was, but restricted to Lists, as now.

If there's a need for a method in Foldable
to return 1 for a tuple, or 0..1 for Maybe/Either,
don't call it `length`, call it `cardinality` (say).
(This is the same approach as for separate `map`, `fmap`,

That isn't breaking genericity/polymorphism/library
`length` was never previously available for non-List
So no code could have been using it.
`concat` was always in the wrong place,
but Foldable (when it was a bit of a rag-bag) used to be
good enough.


More information about the Libraries mailing list