
On 13 November 2014 01:23, Chris Wong
That's different to Evan's original function.
Evan's solution short-circuits: it does not execute the second action if the first succeeds. But your one runs both actions unconditionally.
For example, the expression
try (return $ Just ()) (putStrLn "second action executed" >> return Nothing)
outputs "second action executed" with your solution, but not with Evan's.
The lesson is, applicative and monadic composition don't always yield the same results.
Applicative and monadic composition *should* be the same, given that Applicative contains the law (<*>) = ap And in fact if we rewrite Andras solution as try a b = (<|>) <$> a <*> b It is still broken. The fact that you find libraries where (<*>) is not ap has been confusing for me as well :P. Evan's `try` doesn't use Applicative at all, but short-circuits manually. For this kind of stuff I usually use MaybeT. Francesco