如何对列表中的数字求和

时间:2018-10-02 14:57:21

标签: haskell lazylist

我的问题是:

我有一个列表和一个数字,我想将数字加到列表中,这样我就可以做到

Adding ls n = [x+n| x<-ls] 

它有效。

我的问题是我想根据列表的长度添加n+1n+2n+3

如果我这样做

let b = 0
Adding´ ls n = [x+adder n b| x<-ls] where adder n b= n+b,b++

它不起作用,因为b不前进,所以如果我有Adding´ [1,3,4] 3 = [4,7,9]

2 个答案:

答案 0 :(得分:1)

您可以使用Data.List.mapAccumLmapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c))来完成此任务。

第一个参数是一个函数,该函数接受两个参数a(累加器)和n(列表项)并返回一个元组。在我们的例子中,我们使a(累加器)增加1,并通过添加累加器来映射当前元素n。结果是一个元组,其中第一项是累加器的最终状态,第二项是列表的最终状态。我们通过snd提取第二个项目。

Prelude> snd $ Data.List.mapAccumL (\a n -> (a+1,n+a)) 3 [1,3,4]
[4,7,9]

答案 1 :(得分:1)

递归解决问题。在列表的 first 元素中添加一个数字,然后使用更大的下一个数字在列表的 tail 上递归。重复直到您没有数字为止。不用增加TitleBarWidget,而是开始一个新的函数调用,其中TitleBarItem的值更大。

b

例如,考虑

b

您可以在初始调用中将adding [] _ = [] adding (x:xs) b = x + b : adding xs (b+1) 替换为任何起始值adding [7, 10, 7, 5] 0 == 7 + 0 : adding [10, 7, 5] 1 == 7 : (10 + 1 : adding [7, 5] 2) == 7 : 11 : (7 + 2 : adding [5] 3) == 7 : 11 : 9 : (5 + 3 : adding [] 4) == 7 : 11 : 9 : 8 : [] == [7, 11, 9, 8] ;递归调用总是将其递增。