繁体   English   中英

将具有列表Haskell的相同snd的所有元素求和

[英]Sum all elements with same snd of a list Haskell

我正在尝试在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)

(这样做是为了保持对每个项目的乘积及其所属系数的引用)

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

我尝试使用Data.Sequence更新,如此处第一个答案所示但它似乎并未“更新”已创建的Data.Sequence,它每次都会返回一个新值。

有什么方法可以创建列表并根据索引更新其内容吗? 我试图弄清楚如何递归地解决此问题,但我不知道如何解决,因此将不胜感激。

这是解决方案,

import Data.List
import Data.Function

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

从右到左阅读该功能以了解其功能。

这是分解成较小的部分以了解它的方法

*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)]

这会对列表进行排序,因此所有具有相同第一个元素的对都在一起。 之后,您还可以使用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)]]

这将所有对与相同的第一个元素组合在一起。

*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]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM