Project Euler Problem 14

http://projecteuler.net/index.php?section=problems&id=14
100万未満の数字で、その数字から始まるコラッツ数列が最長になる数。

main = print $ euler14 999999

euler14 :: Integer -> Integer
euler14 n = toInteger $ (+1) $ length $ takeWhile (< (maximum euler14')) euler14'
                      where euler14' = map collatzSequenceLength [1..n]

collatzSequenceLength :: Integer -> Integer
collatzSequenceLength n
                    | n == 1    = 1
                    | odd n     = 1 + (collatzSequenceLength (3*n + 1))
                    | otherwise = 1 + (collatzSequenceLength (n `div` 2))

ふつうに実行するとオーバーフロー

$ ghc -W -o euler14 euler14.hs
$ ./euler14
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize' to increase it.

オプション指定して、一応できたが10分近くかかるw

$ date;./euler14 +RTS -K100M;date
2009611日 木曜日 012040秒 JST
837799
2009611日 木曜日 013012秒 JST

Problem 14 - Haskellはスケるよによると同じ数列が頻出するのでメモ化すればいいらしいが
Haskellレベル1の俺には解法は見当もつかないなぁ。


(2009/06/29 追記)
コメントで教えて頂いた最適化オプションを試してみたらかなり短縮できました(しかもオーバーフローしない)。

$ ghc -W -O2 -o euler14 euler14.hs
$ date;./euler14;date
2009629日 月曜日 094532秒 JST
837799
2009629日 月曜日 094543秒 JST