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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe