【问题标题】:variable not in scope - tail recursive sum - Haskell变量不在范围内 - 尾递归和 - Haskell
【发布时间】:2017-09-30 08:21:25
【问题描述】:

我被variable not in scope: 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)

【问题讨论】:

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

标签: haskell recursion scope tail-recursion


【解决方案1】:

在代码的第二行

zum n = add_sum m n where

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

【讨论】:

    【解决方案2】:

    也许这样更干净?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2021-07-15
      • 2021-01-05
      • 2015-05-09
      相关资源
      最近更新 更多