Re: Proposal: Add isLeft/isRight to Data.Either
Henning Thielemann <lemming <at> henning-thielemann.de>
2012-12-01 00:14:25 GMT
On Fri, 30 Nov 2012, Simon Hengel wrote:
> I propose to add isLeft/isRight to Data.Either, with the obvious
> isLeft :: Either a b -> Bool
> isLeft (Left _) = True
> isLeft (Right _) = False
> isRight :: Either a b -> Bool
> isRight (Left _) = False
> isRight (Right _) = True
> There has been a discussion on that before . While I agree that
> fromLeft/fromRight are moot, I don't see issues with isLeft/isRight.
> Personally I care mostly about isLeft, but for orthogonality I propose
> to add both isLeft and isRight.
> Here is a (possibly incomplete) list of packages that come with their
> own definition of isLeft:
> snap-core, multifocal, PriorityChansConverger, tamarin-prover-utils,
> Agda, PCLT, cmdtheline, scyther-proof, xmlhtml, hspec-expectations,
> Glob, language-glsl, Craft3e, hledger-lib, narc, nemesis,
> type-settheory, PCLT-DB, RJson, bio, errors, rss2irc, heist
It would be a good opportunity to check how these packages use isLeft and
isRight. E.g. if they use them in connection with fromLeft and fromRight
then this would be an argument for me to exclude isLeft and isRight as
cmdtheline uses these functions in test/Main.hs for checking whether
command options could be parsed or not. Maybe the tests could be stricter
if they do (Left expectedValue ==) or (Right expectedValue ==) instead.
snap-core uses these functions once in test/suite/Snap/Core/Tests.hs for
testing whether Left or Right is returned as expected.
multifocal uses isLeft once in src/Language/XML/Xml2Type.hs:
map (\(Left x) -> x) . filter isLeft
maybeLeft :: Either a b -> Maybe a
maybeRight :: Either a b -> Maybe b
in connection with mapMaybe would be more helpful in this case, or just
the existing 'Data.Either.lefts'.
PriorityChansConverger defines isLeft, isRight, fromLeft, fromRight but
does not use them anywhere.
tamarin-prover-utils defines isLeft, isRight but does not use them
Agda uses isLeft and isRight in some QuickCheck properties. And then there
is this application:
-- ps0 :: [NamedArg ParseLHS]
ps0 <- mapM classPat ps
let (ps1, rest) = span (isLeft . namedArg) ps0
(p2, ps3) <- uncons rest -- when (null rest): no field pattern or def pattern found
guard $ all (isLeft . namedArg) ps3
let (f, lhs) = fromR p2
(ps', _:ps'') = splitAt (length ps1) ps
return $ Right (f, LHSProj x ps' lhs ps'')
Looks at least interesting ...
I get tired ...
So far it seems that isLeft and isRight are frequently used in testing.