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

时间:2018-09-23 01:21:42

标签: list haskell tuples fold

我想合并列表,但是我需要传递一个虚拟的初始值,这就是为什么我想使用“文件夹”的原因。

我当前的列表是:

[[(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)]

1 个答案:

答案 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))]