48
|
Hynek -Pichi- Vychodil Paulo Suassuna · 技术社区 · 15 年前 |
1
40
记住哈斯克尔是懒惰的。在绝对必要之前,您的计算(l+1)不会发生。
|
2
14
似乎懒惰会导致
等等你必须强迫
有关更多信息,请参阅 http://haskell.org/haskellwiki/Stack_overflow . |
3
4
foldl也有同样的问题;它会发出砰砰的一声。您可以使用foldl“from Data.List”来避免该问题:
(const.succ)在这里的工作原理与(\a b->a+1)相同,但succ的限制性较小。 |
4
2
问题的最简单解决方案是启用优化。
jmg$ ghc --make tail.hs -fforce-recomp [1 of 1] Compiling Main ( tail.hs, tail.o ) Linking tail ... jmg$ ./tail Stack space overflow: current size 8388608 bytes. Use `+RTS -Ksize -RTS' to increase it. girard:haskell jmg$ ghc -O --make tail.hs -fforce-recomp [1 of 1] Compiling Main ( tail.hs, tail.o ) Linking tail ... jmg$ ./tail 10000000 jmg$ @海内克-皮奇-维乔迪 jmg@girard:/tmp$ cat length.hs myLength :: [a] -> Integer myLength xs = len xs 0 where len [] l = l len (x:xs) l = len xs (l+1) main = print $ myLength [1..10000000] jmg@girard:/tmp$ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.12.1 jmg@girard:/tmp$ uname -a Linux girard 2.6.35-24-generic #42-Ubuntu SMP Thu Dec 2 02:41:37 UTC 2010 x86_64 GNU/Linux jmg@girard:/tmp$ ghc --make length.hs -fforce-recomp [1 of 1] Compiling Main ( length.hs, length.o ) Linking length ... jmg@girard:/tmp$ time ./length Stack space overflow: current size 8388608 bytes. Use `+RTS -Ksize -RTS' to increase it. real 0m1.359s user 0m1.140s sys 0m0.210s jmg@girard:/tmp$ ghc -O --make length.hs -fforce-recomp [1 of 1] Compiling Main ( length.hs, length.o ) Linking length ... jmg@girard:/tmp$ time ./length 10000000 real 0m0.268s user 0m0.260s sys 0m0.000s jmg@girard:/tmp$ 所以,如果你感兴趣,我们可以继续找出你失败的原因。我想,如果在这种情况下,列表上的这种直接递归没有优化为有效的循环,GHC HQ会将其视为一个bug。 |
5
1
正如您所知,有一种更简单的方法来编写此函数:
亚历克斯 |
6
1
eelco.lempsink.nl回答了您提出的问题。以下是Yann回答的示例:
每次向从0开始的累加器添加1时,foldl'都会从左向右遍历列表。
|
trpnd · 如何定义由两个任意单声道变压器组成的单声道变压器? 2 年前 |
Fabus1184 · Haskell mapM_不打印 2 年前 |
Gotthold · 基于范数约束向量的类型 2 年前 |
jian · haskell将另一个函数用作输入参数 2 年前 |
Jocafrei · 用Haskell函数实现最大公约数函数 6 年前 |