I have the following method:
firstRightOrLefts :: [Either b a] -> Either [b] a
firstRightOrLefts eithers =
case partitionEithers eithers of
(_, (x : _)) -> Right x
(xs, _) -> Left xs
What bothers me is the ugly pattern matching and I was wondering if there was a more idiomatic way to write this method. The idea is that I have a bunch of computations that can return Eithers and I just want to get the first result or all of the error messages. Maybe I'm using the wrong data structure. Maybe the Writer monad would be better suited to this task. I'm really not sure at this point. Cheers for any help!
The reverse convention is actually just the monad definition for Either
and the definition for sequence
is adequate for this:
ghci> :t sequence :: [Either a b] -> Either a [b]
sequence :: [Either a b] -> Either a [b]
:: [Either a b] -> Either a [b]
To actually apply this to your case we'd therefore need a function flipEither:
firstRightOrLefts = fe . sequence . map fe
where fe (Left a) = Right a
fe (Right b) = Left b
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With