Números Hamming
Este código tem o intuito de calcular a sequência infinita de números Hamming. A sequência de Hamming começa pelo número 1, os restantes valores são obtidos pela multiplicação de 2, 3 ou 5 por um número Hamming.
hamming = 1 : merge h2 (merge h3 h5)
where h2 = map (2*) hamming
h3 = map (3*) hamming
h5 = map (5*) hamming
-- Une as várias listas infinitas de números de hamming.
-- Em caso de igualdade, ignora 1 dos números para não aparecer repetidos.
merge a@(x:xs) b@(y:ys) | x < y = x : merge xs b
| x == y = x : merge xs ys
| otherwise = y : merge a ys