composites (p:ps) = cs where cs = (p*p) : merge (map (p*) (merge ps cs)) (composites ps) merge (x:xs) (y:ys) | xy = diff (x:xs) ys