gpt4 book ai didi

haskell - 如何在Haskell中解决 "stack space overflow"

转载 作者:行者123 更新时间:2023-12-04 22:01:59 25 4
gpt4 key购买 nike

运行以下程序将打印“空间溢出:当前大小 8388608 字节”。我已经阅读了 thisthis ,但仍然不知道如何解决我的问题。我正在使用 foldr,难道不应该保证它是“尾递归”吗?

到目前为止,我对 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

编辑:为简单起见,删除 isPrime 的定义

最佳答案

正如 pierr 回答的那样,您应该使用 foldl' 。更多细节:

  • foldl' 在将其提供给折叠步骤之前计算其“左侧”。
  • foldr 为您的折叠步骤提供右侧值的“thunk”。这个“thunk”将在需要时计算。

  • 让我们用 foldr 求和,看看它是如何计算的:
    foldr (+) 0 [1..3]
    1 + foldr (+) 0 [2..3]
    1 + 2 + foldr (+) 0 [3]
    1 + 2 + 3 + foldl (+) 0 [] -- this is a big thunk..
    1 + 2 + 3 + 0
    1 + 2 + 3
    1 + 5
    6

    并使用 foldl' :(代码中省略了标记,因为 SO 不能很好地显示它)
    foldl (+) 0 [1..3]
    -- seq is a "strictness hint".
    -- here it means that x is calculated before the foldl
    x `seq` foldl (+) x [2..3] where x = 0+1
    foldl (+) 1 [2..3]
    x `seq` foldl (+) x [3] where x = 1+2
    foldl (+) 3 [3]
    x `seq` foldl (+) x [] where x = 3+3
    foldl (+) 6 []
    6
    foldr 的良好用途,不会泄漏。 “步骤”必须:
  • 返回一个不依赖于“右侧”的结果,忽略它或将它包含在一个惰性结构中
  • 原样返回右侧

  • 良好的 foldr 用法示例:
    -- in map, the step returns the structure head
    -- without evaluating the "right-side"
    map f = foldr ((:) . f) []

    filter f =
    foldr step []
    where
    step x rest
    | f x = x : rest -- returns structure head
    | otherwise = rest -- returns right-side as is

    any f =
    foldr step False
    where
    -- can use "step x rest = f x || rest". it is the same.
    -- version below used for verbosity
    step x rest
    | f x = True -- ignore right-side
    | otherwise = rest -- returns right-side as is

    关于haskell - 如何在Haskell中解决 "stack space overflow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292212/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com