【发布时间】:2019-05-18 03:06:50
【问题描述】:
我正在学习 Haskell,但我遇到了一个我没想到的异常“堆栈溢出”。
代码相当简单:
type Reals = Double
prod :: Reals -> Reals -> Reals
prod a b = a*b
coprod :: Reals -> Reals -> Reals
coprod a b = a + b - (prod a b)
newsum :: Reals -> Reals -> Int -> Reals
newsum a b n =
approxA!!n
where
approxA = a : zipWith coprod approxA approxB
approxB = b : zipWith prod approxA approxB
函数 prod、coprod 旨在在 [0,1] 中的实数上进行计算。函数
newsum a b n
对于 n 趋于无穷大,计算函数 (a,b) -> min(1, a+b)。
你可以试试
newsum 0.5 0.5 10
和
newsum 0.5 0.5 10000
看到这个。但是,通过调用
newsum 0.5 0.5 10000000
我得到一个堆栈溢出。 newsum 函数很简单,可以进行线性(在 n 中)个 Double 类型的操作。换句话说,构造 [Reals] 类型的(无限)列表的第 n 个元素
大约一个
和
大约B
需要线性时间。
问题 1:为什么会出现堆栈溢出? | Haskell(或 GHCi)的限制是什么?如何在上述简单程序中(提前)估计它们?
问题 2:Haskell 中是否有一个标志/命令来指示解释器在需要时自动分页内存?我想编写类似于数学的代码,不想花时间考虑内存限制、堆栈溢出等问题。
谢谢!
【问题讨论】:
-
请一次只回答一个问题。 (不过,这看起来几乎与这里讨论的场景一模一样:wiki.haskell.org/Stack_overflow)
-
“我想编写类似于数学的代码,不想花时间考虑内存限制、堆栈溢出等问题。”编程不是这样工作的。除非你很高兴在未来的千年中得到答案,否则就是这样。
-
Doesn't reproduce。尝试编译您的代码,而不是将源代码加载到 GHCi。
-
该问题专门询问 GHCi。而且我认为 op 希望他们的代码在此处运行是合理的,毕竟这就是您使用优化编译的建议。
标签: haskell