List Haskell:如何使用foldr组合元组列表?
我想合并我的列表,但我需要传入一个伪初始值,这就是为什么我想使用“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,_,
[[(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将共享它们@WillNessconcat
会“销毁”组,如中所示,会忘记分组。@WillNess解决问题不需要分组。此外,OP明确表示,他希望根据姓名合并列表,而不考虑分组。
λ> main
fromList [("Bill J",(3,5.2)),("Bob J",(1,4.0))]