
Daniel Fischer wrote:
Ishaaq Chandy wrote:
If this question sounds a bit noob-ish, that would be because I am one - so apologies in advance!
I have functions that look something like these:
f1 :: [a] -> [b] f1 xs = [foo [x1, x2] | x1 <- xs, x2 <- bar x1, baz x1 /= baz x2]
f2 :: [a] -> [b] f2 xs = [foo [x1, x2, x3] | x1 <- xs, x2 <- bar x1, x3 <- bar x2, baz x1 /= baz x2, baz x1 /= baz x3, baz x2 /= baz x3] [...]
Now, there is probably a frighteningly elegant way to do it with foldM or somesuch, but I don't see it at the moment :(
That would be a variant of iterate for monads. iterateM :: Int -> (a -> m a) -> a -> m [a] iterateM n f a | n < 0 = return [] | otherwise = (a:) `liftM` (iterateM (n-1) f =<< f a) f n xs = filter p `liftM` (iterateM n bar =<< xs) where p xs = let ys = map baz xs in nub ys == ys Regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com