I tend to use `pure` and `mfilter` for this case:

\x -> fromMaybe 0 $ mfilter (> 0) $ pure (x - 10)

-- ocharles

On Sun, Dec 21, 2014 at 10:54 AM, Nikita Volkov <nikita.y.volkov@gmail.com> wrote:

I propose to add the following utility function into Control.Applicative:

cond :: (Alternative f) => (a -> Bool) -> a -> f a
cond p a = if p a then pure a else empty

Following is a typical use case:

\x -> fromMaybe 0 $ cond (> 0) $ x - 10

which is the same as

\x -> let y = x - 10 in if y > 0 then y else 0

Why the first one is better:

  1. The control flow is evident and goes from right to left step by step.
    It’s not scattered around like in the second example.

  2. No need to interrupt to imagine a name for a temporary variable.

  3. Less noise.

Now, since it’s generalised to Alternative one can imagine tons of other useful cases for this.

Alternative titles:

  • conditional

  • partial

Best regards,
Nikita


_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://www.haskell.org/mailman/listinfo/libraries