Haskell:在大型列表中查找max时堆栈溢出

时间:2015-08-19 19:19:46

标签: performance haskell stack-overflow lazy-evaluation

我有problem 1-4 of the Matasano Cryptopals Challenge的以下实现,在文件中找到一行,用单个字节xor'd的文本字符串。它适用于大文件,但显示“堆栈空间溢出:当前大小8388608字节”。提供的文件。

<rule name="Domain redirect" >
  <match url="*" />
  <conditions>
    <add input="{HTTP_HOST}" pattern="^.+$" />
  </conditions>
  <action type="Redirect" url="http://www.mydummysite.com/{R:0}" />
</rule>

该程序通过遍历包含每个可能键的每个输入行xor'd的列表来工作。我怀疑这个大型列表以某种方式对溢出负责,但我认为这不会导致内存问题,因为列表会被懒惰地生成。我不认为我对何时评估thunks以及如何导致堆栈溢出有足够的理解。

所以我的问题是:为什么生成或遍历此列表会导致堆栈溢出?

1 个答案:

答案 0 :(得分:1)

正如this thread中所讨论的那样,我们现在在序言中列出的maximumBy在性能上并不是最佳的,对于各种各样的,好吧,我们只说“理由”。

如果您使用建议的maximumBy'函数,这是严格的,您可能会修复泄漏:

foldl1' f l = foldl' f (head l) (tail l)

maximumBy' f = foldl1' max'
  where max' x y = case f x y of
                        GT -> y
                        _  -> x