Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dealing with Maybe Bool values

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 ?

like image 233
Sibi Avatar asked Dec 09 '13 12:12

Sibi


1 Answers

As it stands, we don't even need to invoke the monadic apparatus. According to your specification, "Nothing" can be mapped to "False" and "Just b" to "b":

mbor a b = Just (flat a || flat b)
   where flat = maybe False id

As @leftaroundabout correctly points out this essentially is what the Monoid Any instance does.

like image 136
Ingo Avatar answered Oct 06 '22 01:10

Ingo