
On Thu, Aug 8, 2013 at 1:09 PM, Henning Thielemann
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. Erik