-2

我的问题是:

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

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

它有效。

我的问题是我想根据列表的长度添加n+1, 。n+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].

4

2 回答 2

1

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

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

Prelude> snd $ Data.List.mapAccumL (\a n -> (a+1,n+a)) 3 [1,3,4]
[4,7,9]
于 2018-10-02T15:11:07.227 回答
1

递归处理问题。将一个数字添加到列表的第一个元素,然后使用下一个更大的数字在列表的尾部递归。重复,直到你没有数字。不是递增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]

您可以在初始调用中替换0为任何起始值n;递归调用总是递增它。

于 2018-10-02T16:55:16.037 回答