При решении некоторых проблем Project Euler для изучения Haskell (так что в настоящее время я полностью начинаю) я пришел Проблема 13. Я написал это (наивное) решение:
--Get Number of Divisors of n
numDivs :: Integer -> Integer
numDivs n = toInteger $ length [ x | x<-[2.. ((n `quot` 2)+1)], n `rem` x == 0] + 2
--Generate a List of Triangular Values
triaList :: [Integer]
triaList = [foldr (+) 0 [1..n] | n <- [1..]]
--The same recursive
triaList2 = go 0 1
where go cs n = (cs+n):go (cs+n) (n+1)
--Finds the first triangular Value with more than n Divisors
sol :: Integer -> Integer
sol n = head $ filter (\x -> numDivs(x)>n) triaList2
Это решение для n = 500 (sol 500) чрезвычайно медленное (работает более 2 часов), поэтому я подумал, как узнать, почему это решение так медленно. Есть ли какие-нибудь команды, которые говорят мне, где большая часть времени вычислений тратится, поэтому я знаю, какая часть моей программы haskell медленна? Что-то вроде простого профайлера.
Чтобы было ясно, я не прошу для более быстрого решения, но для пути, чтобы найти это решение. Как бы вы начали, если бы у вас не было знания haskell?
Я попытался написать две функции triaList, но не нашел способа проверить, какой из них быстрее, и вот где начинаются мои проблемы.
Спасибо