使用列表Haskell的相同snd对所有元素求和

Jos*_*der 0 recursion haskell list

我正在尝试在Haskell中做一个多项式计算器,我在乘法时遇到了一些问题.多项式被引入作为系数列表,其中第一项对应于x ^ 0,第二项对应于x ^ 1,依此类推.

对于乘法,我有一个元组列表,在第一个元素上表示它们所属的系数,在第二个元素上,它们显示相应的系数:

[(0,0),(0,-1),(0,-2),(0,-3),(0,-4),(0,1),(1,0),(2,-1),(3,-2),(4,-3),(0,2),(2,1),(4,0)
Run Code Online (Sandbox Code Playgroud)

(这样做是为了保持对每个项目的乘积和它所属的系数的参考)

由于这是我进入函数式编程的第一步,我在制作一个列表时遇到了一些麻烦,其中第一个元素是上面列表中元组的所有第二个元素的总和,第0个元素是第一个元素,第二个元素应该是上面列表中元组的所有第二个元素的总和,其中1是第一个元素,依此类推.

我尝试使用Data.Sequence更新,如第一个答案所示, 但似乎并没有'更新'已经创建的Data.Sequence,它每次都返回一个新的.

有没有办法创建一个列表并根据索引更新其内容?我想知道如何递归地解决这个问题,但我不知道如何做到这一点,所以任何帮助将不胜感激.

Sat*_*vik 6

这是解决方案,

import Data.List
import Data.Function

combine :: [(Int,Int)] -> [Int]
combine = map (sum . map snd) . groupBy ((==) `on` fst) . sort 
Run Code Online (Sandbox Code Playgroud)

从右到左阅读函数以了解它正在做什么.

这是破碎成较小的部分来理解它

*Main> sort [(0,0),(0,-1),(0,-2),(0,-3),(0,-4),(0,1),(1,0),(2,-1),(3,-2),(4,-3),(0,2),(2,1),(4,0)]
[(0,-4),(0,-3),(0,-2),(0,-1),(0,0),(0,1),(0,2),(1,0),(2,-1),(2,1),(3,-2),(4,-3),(4,0)]
Run Code Online (Sandbox Code Playgroud)

这会对列表进行排序,因此具有相同第一个元素的所有对都在一起.在此之后你也可以使用fold.

*Main> groupBy ((==) `on` fst) . sort $ [(0,0),(0,-1),(0,-2),(0,-3),(0,-4),(0,1),(1,0),(2,-1),(3,-2),(4,-3),(0,2),(2,1),(4,0)]
[[(0,-4),(0,-3),(0,-2),(0,-1),(0,0),(0,1),(0,2)],[(1,0)],[(2,-1),(2,1)],[(3,-2)],[(4,-3),(4,0)]]
Run Code Online (Sandbox Code Playgroud)

这将所有对具有相同的第一元素.

*Main> combine [(0,0),(0,-1),(0,-2),(0,-3),(0,-4),(0,1),(1,0),(2,-1),(3,-2),(4,-3),(0,2),(2,1),(4,0)]
[-7,0,0,-2,-3]
Run Code Online (Sandbox Code Playgroud)

现在我们只需要计算列表列表中第二个元素的总和.