Запуск вашей второй версии в GHCi:
> length [1..1000000]
*** Exception: stack overflow
Итак, чтобы ответить на ваш вопрос: да, он страдает от этой проблемы, как вы и ожидаете.
Однако GHC умнее обычного компилятора; если вы скомпилируете с полученными оптимизациями, он исправит код и заставит его работать в постоянном пространстве.
В более общем смысле, есть способы заставить строгость в определенных точках в коде Haskell, предотвращая создание глубоко вложенных thunks. Обычный пример - foldl
против foldl'
:
len1 = foldl (\x _ -> x + 1) 0
len2 = foldl' (\x _ -> x + 1) 0
Обе функции - это левые сгибы, которые делают одно и то же, за исключением того, что foldl
ленив, а foldl'
строг. В результате len1
умирает с переполнением стека в GHCi, а len2
работает правильно.