变量不在范围内-尾部递归和-Haskell

变量不在范围内-尾部递归和-Haskell,haskell,recursion,scope,tail-recursion,Haskell,Recursion,Scope,Tail Recursion,我遇到了变量不在范围内:m错误。 这应该是一个以尾部递归方式对n个数字求和的代码 zum :: Integer-> Integer zum n = add_sum m n where add_sum :: Integer-> Integer-> Integer add_sum m n | n == 0 = m | otherwise = add_sum (m+n) (n-1) 也许这样更干净 sum n = go 0 n where go m

我遇到了
变量不在范围内:m
错误。 这应该是一个以尾部递归方式对n个数字求和的代码

zum :: Integer-> Integer 
zum n = add_sum m n where
add_sum :: Integer-> Integer-> Integer
add_sum m n
    | n == 0    = m
    | otherwise = add_sum (m+n) (n-1)

也许这样更干净

sum n = go 0 n
     where go m 0 = m
           go m n = go (m+n) (n-1)


> sum 4
10

在代码的第二行

zum n = add_sum m n where

未定义“m”。也许它的用意是代替“m”,那里需要有0。

在你的行中
zum n=add_sum m m n
你在哪里定义
m
?啊,是的!谢谢就是那条线。我发现了问题!它应该是:zum n=在适当的地方加上_sum0 n。您可以添加答案(允许)并接受,以标记问题已解决。完成!再次感谢。顺便说一下,我不确定这是不是尾部递归。编译器可能足够聪明,可以识别它,但是对于大型if/else表达式来说,使用卫士是一种语法上的糖分。如果我错了,有人可以纠正我,但我认为您的函数将扩展到
如果n==0,那么m else如果(n-1)==0,那么m+1 else如果…
。更多信息。您希望定义
add_sum
,使其与参数匹配,而不是使用保护。