Небольшой вопросик. Предположим нам нужно посчитать сумму всех квадратов чисел от 1 до 1000 удовлетворяют некоторому условию test.
(1 вопрос) Есть ли разница («внутренняя») между тремя решениями? Если есть, то что быстрее всего работает?
sum (filter test (map (^2) [1..1000]))
sum . filter test . map (^2) $ [1..1000]
sum [ n^2 | n <- [1..1000], test n ]
(2 вопрос) Как хаскель работает на внутреннем уровне: создаёт список из тясячи чисел, потом их передает map, с выхода map список квадратов идёт на фильтр, потом отфильтрованный список на sum? Если да, то неужели нельзя придумать какой-нибудь оптимизатор, который преобразует код в простой итеративный процесс (это быстрее и не надо тратить память на хранение кучи списков)
for (i = 1, sum = 0; i <= 1000; i++)
if (test(k = i*i))
sum += k