[Haskell-cafe] combining predicates, noob question
Brent Yorgey
byorgey at seas.upenn.edu
Fri Jul 6 21:19:25 CEST 2012
On Fri, Jul 06, 2012 at 03:17:54PM -0300, Felipe Almeida Lessa wrote:
> On Fri, Jul 6, 2012 at 2:11 PM, Sebastián Krynski <skrynski at gmail.com> wrote:
> > As I was using predicates (a -> bool) , it appeared the need for combining
> > them with a boolean operator (bool -> bool -> bool) in order to get a new
> > predicate
> > combining the previous two. So I wrote my function combinerPred (see code
> > below). While I think this is JUST ok, i'm feeling a monad in the air.
> > So.. where is the monad?
> >
> > combinerPred :: (a -> Bool) -> (a -> Bool) -> (Bool -> Bool -> Bool) ->
> > (a -> Bool)
> > combinerPred pred1 pred2 op = \x -> op (pred1 x) (pred2 x)
>
> That's the `(->) a` monad:
>
> import Control.Applicative
>
> combinerPred :: (a -> Bool) -> (a -> Bool) -> (Bool -> Bool ->
> Bool) -> (a -> Bool)
> combinerPred pred1 pred2 op = op <$> pred1 <*> pred2
By the way, I find it more natural to make 'op' the first argument,
because it is more useful to partially apply combinerPred to an
operation that it is to some predicates. Also, in that case
combinerPred is simply liftA2:
import Control.Applicative
combinerPred :: (Bool -> Bool -> Bool) -> (a -> Bool) -> (a -> Bool) -> (a -> Bool)
combinerPred = liftA2
-Brent
More information about the Haskell-Cafe
mailing list