Created: 2022-02-06 22:30
Is there some version of Alternative
’s <|>
that does this:
(Alternative f, Monad m) => m (f a) -> m (f a) -> m (f a)
This type checks liftM2 (<|>)
But the problem is it will run both actions, but I only want to run the 2nd one if the first one didn’t succeed:
Here’s liftM2
implementation in Base:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
In practice what I’m trying to do is make a request (the m
), if it doesn’t succeed (f a
is Maybe a
) then I run the second request.
There’s Alternative
for MaybeT
, that’s probably what I want.
#continuehere try Alternative
for MaybeT
/ ExceptT