gpt4 book ai didi

haskell - 全局变量 “total” 未正确更新

转载 作者:行者123 更新时间:2023-12-05 09:35:01 27 4
gpt4 key购买 nike

我正在做一项作业,计算列表中所有整数的总和。除了标准加法运算符之外,我应该在没有任何标准库函数帮助的情况下这样做

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

输入的 a 应该预期处理的是 [][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 返回 0,几乎就像它是一个常数。我可能会那样编程,但我不太确定发生了什么。

根据赋值描述,我不能通过递归函数传递一个变量来存储这个值。我以前也这样做过。有谁知道是否有办法在函数外部设置“total”变量。

最佳答案

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

这段代码说了什么:

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

  • sum1 获取一个整数列表并生成一个不产生任何结果的 IO 操作

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

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

    • 否则:

      • 创建一个名为total新局部变量,隐藏全局变量,并将其定义为x 加上自身(无穷大循环)

      • 在列表的尾部递归调用sum1

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

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

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

sum1 :: [Int] -> Int

如果你想打印 sum1 应用于某些列表 someList 的结果(例如来自 main),使用 print 在那里,即 print (sum1 someList)

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

sum1 [] = …

sum1 (x : xs) = …

您需要定义这些情况,以便像 sum1 [1, 2, 3, 4] 这样的输入,您记得是 syntactic sugar对于 sum1 (1 : (2 : (3 : (4 : [])))) 生成等同于 1 + 2 + 3 + 4 的内容。

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

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

假设xsys 为空,不应该改变和:

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

其次,对于非空情况:给定一个元素 x::Int 和一个列表 xs::[Int],您需要计算两者的总和。例如,给定 [1, 2, 3, 4]x 设置为 1xs[2、3、4]。假设您已经有了 xs 的总和;那和 x 的结果是什么?以及如何获得 xs 的总和?

关于haskell - 全局变量 “total” 未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66177450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com