全局变量“total”没有正确更新

我正在做一项任务来计算列表中所有整数的总和。我应该在没有标准加法运算符以外的任何标准库函数的帮助这样做

我认为这意味着我不能使用length. 我的理解是正确的,对吧?这成为问题,因为我不确定我如何知道何时停止我的递归函数以遍历数组。

输入的 a 应该处理 are[]并且[0-X]其中 x 是任何整数。该示例将 X 设为 10,因此不要指望要测试任何巨大的东西。

作业提到它应该采用以下格式,但我不确定我是否遵循:

sum1 []     = ...
sum1 (x:xs) = ...

这是我利用长度的内容。它工作正常,我真的不在乎它是否效率低下。这是我第一次使用 Haskell:

iterate_list :: [Int] -> Int -> Int -> IO()
iterate_list func_list index total = do
    if index < length func_list
    then do
        let new_total = total + (func_list !! index)
        let new_index = index + 1
        iterate_list func_list new_index new_total
    else 
        print(total)
        

sum1 :: [Int] -> IO()
sum1 list = do
    if length list < 1
    then do
        print(0)
    else
        iterate_list list 0 0

更新:根据评论,这是我生成的代码。

total :: Int
total = 0

sum1 :: [Int] -> IO()
sum1 (x:xs) = do
    if xs == []
    then do
        print(total)
    else do
        let total = total + x
        sum1 xs
total :: Int
total = 0

sum1 :: [Int] -> IO()
sum1 (x:xs) = do
    if xs == []
    then do
        print(total)
    else do
        let total = total + x
        sum1 xs

但是,我现在遇到的问题是total返回 0,几乎就像它是一个常数。我可能是这样编程的,但我不太确定发生了什么。

根据赋值描述,我无法通过递归函数传递变量来存储此值。我以前就是这样做的。有谁知道是否有办法total在函数之外使用“ ”变量。

回答

这段代码说的是:

  • 全局total是一个常数整数,等于0

  • sum1 接受一个整数列表并产生一个不产生结果的 IO 操作

  • 如果sum1给出一个非空列表,则:

    • 如果该列表的尾部为空(即整个列表有 1 个元素),则打印全局变量 total

    • 除此以外:

      • 创建一个名为的新局部变量total,隐藏全局变量,并将其定义为xplus 自身(无限循环)

      • 递归调用sum1列表尾部

  • 如果sum1给出一个空列表,它会抛出一个错误

这表明你的思考非常迫切。与其试图定义一个自下而上的过程来逐步更新总数直到它累积到最终结果,您需要考虑如何通过分解输入来将总数计算为一个值。Haskell 中的变量是不可变的;当你写的时候=,它意味着相等,永远不要“分配”或“更新”。

首先,sum1应该返回,Int因为您不需要IOdo符号。

sum1 :: [Int] -> Int

如果要打印sum1应用于某个列表someList(例如 from main)的结果,请使用printthere,即print (sum1 someList).

接下来,应该根据输入的两种可能情况定义函数:空列表和非空列表。

sum1 [] = …

sum1 (x : xs) = …

您需要定义这些情况,以便像 那样的输入sum1 [1, 2, 3, 4](您会记得它是语法糖,用于sum1 (1 : (2 : (3 : (4 : []))))生成等效于1 + 2 + 3 + 4.

首先,在一个空列表的情况下,结果应该是什么?您可以从以下事实中推断出这一点:附加在一起的两个列表的总和应该与每个列表的总和相同;也就是说,对于任何列表xsand ys,这些表达式应该产生相同的结果:

sum1 xs + sum1 ys
sum1 (xs ++ ys)

假设xsorys为空,它不应该改变总和:

  • sum1 [] + sum1 ys= sum1 ([] ++ ys)=sum1 ys
  • sum1 xs + sum1 []= sum1 (xs ++ [])=sum1 xs

其次,对于非空情况:给定一个 elementx :: Int和一个 list xs :: [Int],您需要计算两者的总和。例如,给定[1, 2, 3, 4],x设置为1并且xs[2, 3, 4]。假设你已经xs有了 ;结果是什么x?你怎么能得到 的总和xs


以上是全局变量“total”没有正确更新的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>