Запуск следующей программы приведет к печати «переполнение пространства: текущий размер 8388608 байт». Я прочитал this и this, но до сих пор не знаю, как решить мою проблему. Я использую foldr, не должно ли быть гарантировано «хвостом рекурсивным»?как решить «переполнение стека» в haskell
Я до сих пор чувствую себя прекрасно в отношении Haskell, пока не знаю, что я должен предотвратить «переполнение пространства» при использовании мощной рекурсии. :)
module Main where
import Data.List
value a b =
let l = length $ takeWhile (isPrime) $ map (\n->n^2 + a * n + b) [0..]
in (l, a ,b)
euler27 = let tuple_list = [value a b | a <-[-999..999] , b <- [-999..999]]
in foldr (\(n,a,b) (max,v) -> if n > max then (n , a * b) else (max ,v)) (0,0) tuple_list
main = print euler27
EDIT: удалить Definiton из isPrime
для простоты
Это трудно с любым функциональным языком. Как умный парень, которого я знаю, однажды сказал, что каждая абстракция протекает. Функциональные языки отлично подходят для выражения себя, и показ алгоритма будет выполнен правильно, но все они должны предположить, что у них есть бесконечная память. Добро пожаловать в мир установки вашей красивой программы в настоящий компьютер ... – Spence