Почему это выражение Haskell такое медленное?

Я работаю над проблемой 14 проекта Эйлера. Вот мое решение.

import Data.List

collatzLength :: Int->Int
collatzLength 1 = 1
collatzLength n | odd n = 1 + collatzLength (3 * n + 1)
                | even n = 1 + collatzLength (n `quot` 2)

maxTuple :: (Int, Int)->(Int, Int)->Ordering
maxTuple (x1, x2) (y1, y2)  | x1 > y1 = GT
                | x1 < y1 = LT
                | otherwise = EQ

Я использую следующее из GHCi

maximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]

Я знаю что если бы Haskell оценивал строго, время на это было бы примерно O (n 3 ). Однако, поскольку Haskell вычисляет лениво, кажется, что это должно быть неким постоянным числом, кратным n. Это длится уже почти час. Кажется очень неразумным. Кто-нибудь знает, почему?

9
задан Zero Piraeus 22 January 2015 в 20:05
поделиться