我想合并列表,但是我需要传递一个虚拟的初始值,这就是为什么我想使用“文件夹”的原因。
我当前的列表是:
[[(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)]
答案 0 :(得分:1)
首先,我将弄平您的列表(使用concat
),然后递归地将值累加到Map
中。在累积的同时,我将确保您将现有的值加起来(这是add
函数的作用)。
module Main where
import Data.List
import qualified Data.Map as M
main = print $ makeMap vals
makeMap :: (Ord k, Num a, Num b) => [(a, k, b)] -> M.Map k (a, b)
makeMap = foldl' go mempty
where
go m (x,name,y) = M.insertWith add name (x,y) m
add (a,b) (c,d) = (a+c,b+d)
vals = concat [[(1, "Bob J", 4.0)],[(1, "Bill J", 2.5),(2,"Bill J", 2.7)]]
结果是
λ> main
fromList [("Bill J",(3,5.2)),("Bob J",(1,4.0))]