我的问题是:
我有一个列表和一个数字,我想将数字加到列表中,这样我就可以做到
Adding ls n = [x+n| x<-ls]
它有效。
我的问题是我想根据列表的长度添加n+1
,n+2
,n+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]
。
答案 0 :(得分:1)
您可以使用Data.List.mapAccumL
(mapAccumL :: 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]
;递归调用总是将其递增。