
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
* 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