【问题标题】:Haskell: Sum of last 2 integers in a stringHaskell:字符串中最后两个整数的总和
【发布时间】:2021-02-12 06:54:06
【问题描述】:

我是 Haskell 的新手,我正在尝试一项任务,其中结果应该是字符串中最后两个整数的总和。

我完全理解整个加法部分,但是我正在努力解决的是递归操作字符串。为了尝试这个任务,我首先“翻转”了字符串,最后一个整数成为第一个在第 n 项之后拆分的字符串,在本例中为 2。

例如,对于给定的字符串 1,2,3,4,5,6,7。结果将是 13,如 6+7=13。

sum' :: [a] -> [a]
sum' = foldl (\acc x -> x : acc) []

sum' :: [a] -> [a]
sum' [] = []
sum' xs = let h = splitAt 1 xs in h

sum' :: (Num a) => [a] -> a 
sum' [] = 0 
sum' (xs:x) = xs + sum' (x)

main :: IO()
main = do
          print(sum'[1,2,3,4,5,6,7])

目前非常混乱且效率极低(更不用说损坏了)。非常感谢任何对 haskell 功能有帮助的帮助。

【问题讨论】:

  • 如果列表只包含一两个项目怎么办?
  • 这是一个很好的问题,这样的列表不适用于这个程序。但是,对于手头的任务,只需要字符串 1,2,3,4,5,6,7
  • "在第 n 个任期后拆分,在本例中为 2" .... splitAt 1 没有这样做。此外,您对同一个名称sum' 有三个不同的定义。你不能在 Haskell 中这样做,必须为每个使用不同的名称。名字也应该有意义。您“定义要反转的函数”然后调用它...sum'?对于某些/许多人来说,正确使用可能非常困难,而且不会出错。好名字让我们更容易写出正确的代码。

标签: string haskell recursion sum integer


【解决方案1】:

处理列表的结尾很困难。我的建议是 reverse 列表和 take 前面的 2 个元素。

let a:b:_ = reverse [1,2,3,4,5,6,7] in a + b

顺便说一句,你在这里拥有的不是一个字符串,而是一个 Int 列表。虽然字符串在 Haskell 中始终是列表,但并非所有列表都是字符串

【讨论】:

  • (字符串是Chars的列表)
【解决方案2】:

你应该递归直到列表中只剩下两个元素。因此,您为正常行为实现了两个子句,并为“极端情况”实现了一些额外的子句。

基本情况 (1) 是一个包含两个元素的列表,您需要对其中的元素求和;递归情况 (2) 处理具有三个或更多元素的列表,并在列表的尾部进行递归:

sumlast2 :: Num a => [a] -> a
sumlast2 [x1, x2] = …         -- (1)
sumlast2 (_:xs@(_:_:_)) = …   -- (2)
-- … extra clauses for corner cases …

您仍然需要填写 部分。在第二个子句 (2) 中,xs 因此是列表的尾部:一个包含除第一个之外的所有元素的列表。因此,您需要根据sumlast2 定义具有三个或更多元素的sumlast2

【讨论】:

  • 您谈到了定义列表。该任务需要通过print(sum'[1,2,3,4,5,6,7]) 命令在main 中声明该列表。我如何将此声明与您的解决方案联系起来?
  • @person2000:不,我们定义了sumlast2函数,所以你使用print(sumlast2 [1 .. 7])
  • Edit = the sum' 函数,正如我所声明的那样,没有必要并且可以使用,但是程序的结果必须显示在“此列表中函数的打印结果”命令中。跨度>
  • 啊,我明白了。在我修改问题之前,您似乎已经做出了回应。
猜你喜欢
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多