darcs patch: Add justIf to Data.Maybe

Duncan Coutts duncan.coutts at worc.ox.ac.uk
Sat Aug 22 11:10:37 EDT 2009


On Sat, 2009-08-22 at 10:18 +0200, Joachim Breitner wrote:
> Hi,
> 
> I propose the attached change

> Fri Aug 21 19:17:12 CEST 2009  Joachim Breitner <mail at joachim-breitner.de>
>   * Add justIf to Data.Maybe

justIf :: a -> Bool -> Maybe a
justIf x True = Just x
justIf x False = Nothing

Which apparently is intended to be used like:

v `justIf` a


Another instance of this idiom, this one from Cabal, is

check :: Bool -> PackageCheck -> Maybe PackageCheck
check False _  = Nothing
check True  pc = Just pc

which generalises to

check :: Bool -> a -> Maybe a
check False _  = Nothing
check True  x  = Just x

which is used without `back ticks` like:

check (not (null deprecatedExtensions)) $
      PackageDistSuspicious $
           "Deprecated extensions: "
        ++ {- some fairly big expression -}

In this use case the result is typically a lot bigger than the
condition, so the condition goes first rather than last.

As Jón was suggesting we might want to generalise to MonadPlus rather
than putting it in Data.Maybe, it becomes rather similar to the existing
function 'guard':

guard :: MonadPlus m => Bool -> m ()
guard True  = return ()
guard False = mzero


check :: MonadPlus m => Bool -> a -> m a
check True  x  = return x
check False _  = mzero

Using a Bool for the condition is a tad more general than a predicate
like:

check :: MonadPlus m => (a -> Bool) -> a -> m a

In particular, the use case in Cabal does not fit the predicate pattern
because the condition is not a condition on the value being returned but
on something else in the environment.

BTW, I also don't want to take too strong a position on the name ;-)

Duncan



More information about the Libraries mailing list