Proposal: (a -> Bool) -> a -> f a

Roman Cheplyaka roma at ro-che.info
Sun Dec 21 11:14:53 UTC 2014


I like the idea.

This is similar to guard (MonadPlus m => Bool -> m ()), so maybe exploit
that similarity for naming.

Suggestions:

* guardp (for "predicate")
* guardf (for "function")
* guardWith

I wouldn't be opposed to cond, either.

On 21/12/14 12:54, Nikita Volkov 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
> 



More information about the Libraries mailing list