List Haskell:如何使用foldr组合元组列表?

List Haskell:如何使用foldr组合元组列表?,list,haskell,tuples,fold,List,Haskell,Tuples,Fold,我想合并我的列表,但我需要传入一个伪初始值,这就是为什么我想使用“foldr” 我目前的名单是: [[(1, "Bob J", 4.0)],[(1, "Bill J", 2.5),(2,"Bill J", 2.7)]] 我想根据他们的名字合并列表,但在合并数字时,我还需要做算术运算 我目前的代码是: grp xs = foldr combine xs where combine (x,_,y) (totalX,_,totalY) = (totalX+x,_,

我想合并我的列表,但我需要传入一个伪初始值,这就是为什么我想使用“foldr”

我目前的名单是:

[[(1, "Bob J", 4.0)],[(1, "Bill J", 2.5),(2,"Bill J", 2.7)]]
我想根据他们的名字合并列表,但在合并数字时,我还需要做算术运算

我目前的代码是:

grp xs = foldr combine xs
  where
    combine
    (x,_,y)
    (totalX,_,totalY)
    = (totalX+x,_,totalY+fromIntegral x *y)
这将返回一个错误。我希望totalX和totalY最初为零,这样就不会影响计算。我该怎么做

编辑:我希望我的输出采用相同的格式,因此我希望:


[(1,“Bob J”,4.0],(3,“Bill J”,2.6)]

首先,我会将列表展平(使用
concat
),然后递归地将值累加到
Map
中。在累加过程中,我会确保通过加法(这就是
add
函数所做的)

结果是

λ> main                                                                                                                                                       
fromList [("Bill J",(3,5.2)),("Bob J",(1,4.0))] 

您看到的错误是什么?看起来像…的另一个变体,但我不确定是否作为一个复制品结束,因为分组步骤似乎已经完成,只剩下组合步骤。即使如此,我仍然可能使用我在链接问题上建议的代码,除非此问题之前的分组有一些错误你所需要的只是
map
,和
map f=foldr((:).f)[
@WillNess这并没有详细说明如何组合元素。@INTERNET的小步骤…OP可以从这个小提示中找到解决方案,也可以总是要求澄清。:)在O(n)时执行O(n日志n)是可能的,一般不推荐。这些组已经存在,您建议销毁它们,然后着手重新创建它们。我们可以使用可变哈希表来获得O(n),但是是的
Map
插入是对数的。另外,要明确的是,值本身并没有被销毁,GHC将共享它们@WillNess
concat
会“销毁”组,如中所示,会忘记分组。@WillNess解决问题不需要分组。此外,OP明确表示,他希望根据姓名合并列表,而不考虑分组。
λ> main                                                                                                                                                       
fromList [("Bill J",(3,5.2)),("Bob J",(1,4.0))]