GHCI не такой уж ленивый на винде?

Введя следующее в GHCI в Windows:

foldl (+) 0 $ take 100000000 $ map sqrt [1..]

дает:

<interactive>: out of memory

при компиляции (с помощью GHC) и запуске этой программы:

main = do
    let score = foldl (+) 0 $ take 100000000 $ map sqrt [1..]
    putStrLn $ show score

печатает ожидаемый ответ без ошибки памяти.

Есть ли причина для такого поведения? Мне кажется, что лень Haskell должна предотвратить сбой этого единственного лайнера.


person Piotr Lopusiewicz    schedule 26.04.2013    source источник
comment
Проблема на самом деле в слишком большой лени.   -  person hammar    schedule 26.04.2013


Ответы (1)


Это просто GHC, выполняющий строгость и другие оптимизации. GHCi не выполняет тех же оптимизаций, что и полный компилятор.

В частности, foldl накапливает слишком много переходов, и они вызывают у вас переполнение. Однако, когда я меняю его на строгий foldl', даже GHCi может с этим справиться. Вам следует прочитать этот вопрос, чтобы узнать больше о том, почему это .

person Daniel Gratzer    schedule 26.04.2013