gpt4 book ai didi

list - Haskell - 列表中累积的总和

转载 作者:行者123 更新时间:2023-12-01 07:09:21 25 4
gpt4 key购买 nike

我需要创建或知道 Haskell 中是否有允许您从列表中添加项目的功能。因此,例如:

cumulativeAmount :: [Integer] -> [Integer]

cumulativeAmount [1,2,5,8,8,0,4,2] = [1,3,8,16,24,24,28,30]

cumulativeAmount [1,4,7,0,5] = [1, 1+4, 1+4+7, 1+4+7+0, 1+4+7+0+5] = [1,5,12,12,17]

我尝试使用 mapscanl功能,但我没有得到我想要的,因为我添加了所有元素。

最佳答案

这正是 scanl1 :: (a -> a -> a) -> [a] -> [a] 的目的:

Prelude> scanl1 (+) [1,2,5,8,8,0,4,2]
[1,3,8,16,24,24,28,30]
scanl1将函数 f :: a -> a -> a 作为输入(此处为 (+)),以及 a 的列表s。它构造一个列表,其中第一项是列表的第一项。这是累加器的第一个值。然后对于每个值,通过调用 f 更新累加器使用累加器和列表的下一个值,然后产生此项目。

所以在 scal1 (+) [1,2,5] 的情况下我们发出的第一项是 1 ,我们还将累加器设置为 1 .下一项是 2 ,所以我们调用 (+) 1 2 (即 3 )这是结果和新的累加器,接下来我们调用 (+) ((+) 1 2) 5 (即 8 )等。

但我认为它更好,作为使用递归的练习。就像我们使用蓄电池之前所说的那样。我们可以通过引入一个额外的函数来实现这一点,其中累加器是我们通过递归调用(和更新)传递的函数。所以在这种情况下,它看起来像:
cumulativeAmount :: [Integer] -> [Integer]
cumulativeAmount [] = ...
cumulativeAmount (x:xs) = go x xs
where go x xs = ...

所以这里是 go 的第一个参数( x ) 是累加器。我把它作为一个练习,用递归来实现它。

关于list - Haskell - 列表中累积的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48401445/

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