Project Euler Problem 12

http://projecteuler.net/index.php?section=problems&id=12
501個以上の約数を持つ最初の三角数

main = print $ fst $ head $ filter (\x -> (snd x) > 500) (map (\n -> (n, factorsNumber n)) triangleNumbers)

--約数チェックは平方根未満まで(ペアの約数があるので*2)
factorsNumber :: Integer -> Integer
factorsNumber n = (2::Integer) * (toInteger $ length [x | x <- [1..floor $ sqrt $ fromInteger n], n `mod` x == 0])

triangleNumbers :: [Integer]
triangleNumbers = map (\n -> foldl1 (+) [1..n]) [1..]

三角数列の一般項を参考に11秒から5秒まで短縮

triangleNumbers :: [Integer]
triangleNumbers = map (\n -> (n * (n+1)) `div` 2) [1..]