BP> If I want a small example to show to people I usually use zipWith. I'd suggest unfoldr + lazyness, such as hammings = 1 : unfoldr (Just . generator) (map (\n -> map (n*) hammings) [2,3,5]) where generator xss = let x = minimum $ map head xss in (x, map (dropWhile (x==)) xss) I guess, it's tough to reproduce even in languages like Prolog.