Haskell 我无法确定为什么会出现***异常:堆栈溢出

Haskell 我无法确定为什么会出现***异常:堆栈溢出,haskell,haskell-stack,Haskell,Haskell Stack,我正在编写调用其他函数的函数。在我发表评论之前,一切都很顺利——A6 AGP(t)。当我尝试运行agp1时,它抛出***异常:堆栈溢出 我尝试过添加和删除括号,这样就不会一次又一次地调用任何函数,但仍然没有成功 import Data.List import System.IO p = 1.50 dt= 0.050 at = 0.075 wMax = 20.00 da1 = 300.0 dcasa = 0.05 dSort = 1.50 dKafv = 0.50 aa1 = 250.0 aca

我正在编写调用其他函数的函数。在我发表评论之前,一切都很顺利——A6 AGP(t)。当我尝试运行agp1时,它抛出***异常:堆栈溢出

我尝试过添加和删除括号,这样就不会一次又一次地调用任何函数,但仍然没有成功

import Data.List
import System.IO

p = 1.50
dt= 0.050
at = 0.075
wMax = 20.00
da1 = 300.0
dcasa = 0.05
dSort = 1.50
dKafv = 0.50
aa1 = 250.0
acasa = 0.05
aKafv = 0.25
aSort = 1.00
v = 1200.0
l = 47490.0


--A1 AGL(t)
agl :: Float -> Float
agl a = a + 5

--A6 AGP(t)
agp :: Float -> Float
agp x = (agp (x-1) - ((at - agp (x-1)) / at)) * (atl (x-1) - at)

agp1 =  agp 2.0

--A7 ATL(t)
atl :: Float -> Float
atl x = (agl x - agl (x+1)) / agl (x)

--A10 DCAS(t)
dcas :: Float -> Float
dcas x = (l/v)*da1*((1.0-dcasa)**(dSort*(x - 1)))*dKafv*(((1 - ((1- 
         dcasa)**(dSort+1))) / dcasa) - 1)


--A11 ACAS(t)
acas :: Float -> Float
acas x = (l/v)*aa1*((1.0-acasa)**(aSort*(x - 1)))*aKafv*(((1 - ((1- 
          acasa)**(aSort+1))) / acasa) - 1)

--A12 Da(t)
da :: Float -> Float
da x = da1 * ((1.0 - dcasa) ** (dSort * (x - 1)))


--A13 Aa(t)
aa :: Float -> Float
aa x = aa1 * ((1.0 - acasa) ** (x - 1))

您需要一些基本情况,其中
agp
不调用自身,因此计算结束。 My gues是您的功能需要如下:

--A6 AGP(t)
agp :: Float -> Float
agp x
    | agp' > 0 = agp'
    | otherwise = 0
    where agp' = (agp (x-1) - ((at - agp (x-1)) / at)) * (atl (x-1) - at)

agp
是一个递归函数,总是进行递归调用-它没有停止的“基本情况”,因此它永远不会停止计算。(请注意,Haskell中的“堆栈溢出”并不是因为它充满了函数调用,就像在其他语言中一样——而是因为“thunks”,即未计算的表达式。但根本原因在这里是一样的,您得到了无限递归。)
agp x=forever(消耗堆栈空间)
Yeah,这很糟糕。请注意,您实际显示的代码不会导致问题,因为没有任何内容会强制使用
agp1
的值。试图打印它的值将强制它,导致无限递归。(我假设你遗漏了一些代码,考虑到A1和A6之间的差距以及存在几个未定义函数的事实,例如,
agl
)@RobinZigmond如果我将基本情况设为:agp 0.0=0.0,我仍然得到无限递归。我的基本情况是否有误?@AprilWilliams如果从
AGP100.5
开始,那么基本情况可能无法达到,因为我们从
0.5
移动到
-0.5
。此外,舍入错误可能会导致问题,因为未考虑
0.00000000 1
0.0
,因此不符合基本情况。您可以尝试定义
agpx | x