Dealing with Maybe Bool values
haskell, monads, option-type
Solution
No. The monad instance has no notion of emptiness1, so it can't check on `Nothing` and replace the value in that case.
What you basically need is the monoid instance; that has `Nothing` as its identity element so whatever you combine with `Nothing` will just come out as is.
instance (Monoid a) => Monoid (Maybe a)
Unfortunately, `Bool` is in itself not a monoid. Well, actually it is a monoid! but not in a unique way, so they couldn't've chosen any particular instances. But with `newtype` wrappers, those are in `Data.Monoid`:
newtype Any = Any { getAny :: Bool }
instance Monoid Any
let's try it...
Prelude Data.Monoid> fmap getAny $ (Just $ Any True) <> (Just $ Any False) Just True Prelude Data.Monoid> fmap getAny $ (Nothing) <> (Just $ Any False) Just False
1Of course, there's `fail`... but that's a historic accident.
Problem
Let us say, I have two `Maybe Bool` value and I want to achieve the following functionality: - If both are `Just` values, I want to perform an `||` between them the values. - If one of them is `Nothing` and the other one is `Just` value, then I want the `Just` value as the output. - If both of them is `Nothing`, then I want `Just False` as the output. I know that this can be achieved using pattern matching. But is it possible to use any monadic functions to acheive the result ? `liftM2` works for this case: ``` ghci> liftM2 (||) (Just True) (Just False) Just True ``` But `liftM2` will produce `Nothing` when any of the one input is `Nothing` (for which I want the other `Just` value). i.e: ``` ghci> liftM2 (||) (Nothing) (Just False) Nothing ``` But I want `Just False` in the above case. Is it possible to do this using any monadic function ?