3 ms·
Technically you only need swap (eg: swap :: Either e2 (Either e1 a) -> Either e1 (Either e2 a) swap (Left z) = (Right (Left z)) swap (Right (Left y)) = (
by a1369209993 6y ago
Technically you only need swap (eg:
swap :: Either e2 (Either e1 a) -> Either e1 (Either e2 a)
swap (Left z) = (Right (Left z))
swap (Right (Left y)) = (Left y)
swap (Right (Right x)) = (Right (Right x))
) to implement join (at the functor `Either e1 . Either e2`) and then a general monad-compose. You could also use:
join :: f1 (f2 (f1 (f2 a))) -> f1 (f2 a)
-- join = fmap join . join . fmap swap -- if you have swap
directly, which doesn't even require f1 and f2 to be monads in the first place (though they do need to be applicative for return/pure/unit). (See http://web.cecs.pdx.edu/~mpj/pubs/RR-1004.pdf http://web.cecs.pdx.edu/~mpj/pubs/RR-1004.pdf for technical details.)
swap is generally trivial (see above) for any sane error-reporting monad, although might be a bit more difficult if you're shoving error-handling logic into them.