Haskell - эффективный эквивалент цикла for?

Я проводил несколько экспериментов и вот кое-что нашел. Рассмотрим следующую программу на C:

int main()
{
   for(int i = 0;
       i < 1000000;
       ++i)
   {}
}

и следующую программу на Haskell:

import System.IO

loop :: Int -> IO ()
loop n = if 0 == n then return () else loop (n-1)

main = loop 1000000

Вот результат времени для указанной выше программы на C:

real    0m0.003s
user    0m0.000s
sys 0m0.000s

... и для программы на Haskell:

real    0m0.028s
user    0m0.027s
sys 0m0.000s

Сначала я подумал, что gcc обнаружил пустой цикл и оптимизировал его, но после увеличения количества итераций время работы программы также увеличилось. Вот результаты времени для обеих программ с числом итераций, установленным на 10000000:

Версия C

real    0m0.024s
user    0m0.023s
sys 0m0.000s

Версия Haskell

real    0m0.245s
user    0m0.247s
sys 0m0.000s

Как видите, программа на Haskell 10 раз медленнее.

Вопрос: какова эффективная альтернатива циклу for в Haskell? Как мы только что видели, простая рекурсия замедляет программу примерно в 10 раз (и это, вероятно, связано с оптимизацией хвостовой рекурсии).

10
задан Don Stewart 8 May 2011 в 07:33
поделиться