http://projecteuler.net/index.php?section=problems&id=87
素直に取りうる値のリストを作ってSetに入れて大きさを見る。
import Data.Set (fromList, size) is_prime n = all (\p -> mod n p /= 0) (takeWhile (\p -> p * p <= n) primes) primes = 2:[ n | n <- [3,5..], is_prime n ] limit = 5 * 10^7 a = [ p + q + r | p <- takeWhile (<limit) (map (^2) primes), q <- takeWhile (<limit-p) (map (^3) primes), r <- takeWhile (<limit-p-q) (map (^4) primes) ] main = print (size (fromList a))