> Evan's solution short-circuits: it does not execute the second action if the first succeeds. But your one runs both actions unconditionally.
Thanks for pointing that out! This is what happens when you only look at the type of a function and *assume* its implementation:)
Actually this is a great way to shed light on the difference between monadic and applicative: In the original function the context chaining itself depends on a computed value (short circuiting), meaning it "properly" relies on (>>=). liftM2 (<|>) - or rather liftA2 (<|>) - does not, it doesn't unbox anything, so it cannot possibly be correct.