Erik Hesselink hesselink at gmail.com
Thu Aug 8 14:38:39 CEST 2013

On Thu, Aug 8, 2013 at 1:09 PM, Henning Thielemann
<lemming at henning-thielemann.de> wrote:
> On Thu, 8 Aug 2013, David Luposchainsky wrote:
>> On 2013-08-07 19:13, Erik Hesselink wrote:
>>>> mapEither :: (l -> l') -> (r -> r') -> Either l r -> Either l' r'
>>>> mapEither fl fr = either (Left . fl) (Right . fr)
>>> This function is hidden in Control.Arrow as (+++).
>> I didn't know about those functions, and it seems everything I wanted is
>> in there somewhere. However, I'm not sure what to think of
>> Control.Arrow, I've always (ab)used it as an extended Data.Tuple, and as
>> of today probably for its Either API functions.
> For me using the arrow functions as Data.Tuple and Data.Either utility
> functions is abuse. Control.Arrow is meant to generalize (->). If you call
> maybeLeft and MaybeRight this is certainly not your intention.

But the point of generalized functions is to use them in a specialized
context, right? You can generalize mapEither in multiple ways: you can
generalize (->), or you can generalize Either (getting bimap from the
bifunctors package). I don't get why it's wrong to specialize the
Arrow to (->) and use the functions on Eithers or tuples.

I do agree that they're hard to find. The same goes for the functions
from Foldable and Traversable (forM_ is often asked for as fromJust).
Perhaps adding a comment to the appropriate modules (Data.Tuple,
Data.Either, Data.Maybe) pointing in the right direction is a good
low-tech solution here.


More information about the Libraries mailing list