Project Euler: Problem5

素数列を作る関数は今までに何回書いたかわからん…。

import Data.List

prime = p [2..]
    where p (x:xs) = x : p (filter (\y -> rem y x /= 0) xs)
factor n = f n prime
    where f 1 _      = []
	  f n (p:ps) | rem n p == 0 = p : f (div n p) (p:ps)
		     | otherwise    = f n ps
merge [] = 1
merge ([]:xss) = merge xss
merge ((x:xs):xss) = x * (merge (xs : (map (delete x) xss)))
main = print $ merge $ map factor [2..20]