3 ms·
> Return values are a million times better than checked exceptions because return values compose No they don't, not even when they're monads (you need monad tr
by hota_mazi 6y ago
> Return values are a million times better than checked exceptions because return values compose
No they don't, not even when they're monads (you need monad transformers to compose monads since they don't universally compose).
- a1369209993 6y agoTechnically 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.