Not exactly what you asked for, but...

    filter (uncurry somePredicate) $ (,) <$> list1 <*> list2

does the job.

Using only applicative operations, it's impossible to affect the 'shape' of the result--this is the difference in power between applicative and monad.

  -- ryan


On Wed, Sep 12, 2012 at 7:40 AM, felipe zapata <tifonzafel@gmail.com> wrote:
Hi Haskellers,

Suppose I have two list and I want to calculate
the cartesian product between the two of them,
constrained to a predicate.
In List comprehension notation is just

result = [ (x, y) | x <- list1, y <-list2, somePredicate x y ]

or in monadic notation

result = do
 x <- list1 
 y <- list2
 guard (somePredicate x y)
return $ (x,y)

Then I was wondering if we can do something similar using an applicative style

result = (,) <$> list1 <*> list2 (somePredicate ???)

The question is then, 
there is a way for defining a guard in applicative Style? 

Thanks in advance,

Felipe Zapata.



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe