On 2 Aug 2007, at 2:28 am, Andy Gimblett wrote:
Is this a reasonable way to compute the cartesian product of a Set?

cartesian :: Ord a => S.Set a -> S.Set (a,a)
cartesian x = S.fromList [(i,j) | i <- xs, j <- xs]
    where xs = S.toList x

Following up on my recent message about (ab)use of monadic operations,
imagine presenting it this way:

cartesian s = S.fromList $ liftM2 (,) s' s' where s' = S.toList s

There are times to use monads and times not to.  (One wonders whether
S.Set is an instance of Monad, and if not, why not.)


It's a fairly "obvious" way to do it, but I wondered if there were any
hidden gotchas.  I'm particularly concerned by toList (O(n)) fromList
(O(n log n)) - but for other reasons I'd really like to be using Set
rather than List for this (I think).

In fact it's worse than that. Given a set with n elements, the Cartesian product of that set with itself has n**2 elements, so S.fromList must take
O(n**2.log(n**2)) = O(n**2.log n) time.

If sets are represented as ordered lists, then the list comprehension
above generates a suitably ordered result.

On the other hand, I've usually found that it pays to avoid explicitly
constructing things like Cartesian products. Could that be the case here?



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

Reply via email to