>>> [Left 1, Right 'c', Left 3] ^.. each._Left [1,3]Checking whether an Either is a Left (like isLeft):
>>> has _Left (Left 1) True
>>> has _Left (Right 1) FalseExtracting a value (if you're sure it's a Left):
>>> Left 1 ^?! _Left 1Mapping over all Lefts:
>>> (each._Left %~ map toUpper) [Left "foo", Right "bar"] [Left "FOO",Right "bar"]Implementation:
_Left f (Left a) = Left <$> f a _Left _ (Right b) = pure (Right b)
>>> fromLeft 1 (Left 3) 3 >>> fromLeft 1 (Right "foo") 1
>>> isLeft (Left "foo") True >>> isLeft (Right 3) FalseAssuming a Left value signifies some sort of error, we can use isLeft to write a very simple error-reporting function that does absolutely nothing in the case of success, and outputs "ERROR" if any error occurred. This example shows how isLeft might be used to avoid pattern matching when one does not care about the value contained in the constructor:
>>> import Control.Monad ( when ) >>> let report e = when (isLeft e) $ putStrLn "ERROR" >>> report (Right 1) >>> report (Left "parse error") ERROR
>>> justifyLeft 7 'x' "foo" "fooxxxx"
>>> justifyLeft 3 'x' "foobar" "foobar"
justifyLeft 7 'x' "foo" == "fooxxxx" justifyLeft 3 'x' "foobar" == "foobar"