Почему это победило бы ленивую оценку Haskell? - PullRequest
3 голосов
/ 30 марта 2012

Сегодня я пишу небольшую программу на Хаскеле.Я обнаружил, что в интерактивном режиме ghci это:

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..])

может повесить ghci и вызвать его сбой из-за нехватки памяти, но это:

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..606])

может работать просто отлично.

Почему ленивая оценка Haskell не может сделать первый запуск в памяти (3G, BTW)?Или, может быть, это причуда ghci?

Спасибо за любые комментарии!

1 Ответ

7 голосов
/ 30 марта 2012

Я думаю, что ваша проблема заключается в следующем:

foldl имеет некоторые проблемы со списками infinte (см. HaskelWiki: Fold )

Но если вы попытаетесь использовать foldr last s, это будет проблемой. Не знаю, если это домашнее задание, но я думаю, что вы хотите найти решение самостоятельно, так что вот подсказка: вместо того, чтобы свернуть, разверните - вот пример с fibonaccis

...