我想创建一个列表的函数,例如
[('A',3), ('B',2), ('C',2), ('A',5), ('C',3), ('C',2)]
Run Code Online (Sandbox Code Playgroud)
然后在字母相同时将数字加在一起.所以上面的输入会产生
[('A',8), ('B',2), ('C',7)].
Run Code Online (Sandbox Code Playgroud)
有人可以请你告诉我如何解决这个问题,我想尽可能多地尝试自己做!
您可以使用Data.Map's fromListWith来构造具有求和值的地图.它的类型是这样的:
fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Run Code Online (Sandbox Code Playgroud)
它需要一对对象列表(如您所述)作为第一个arg,如果它看到重复,它使用一些函数(第一个arg)来组合原始值和新值.从那里,您可以将此映射转换回对列表(也是Data.Map中的函数).
您可以使用纯列表执行此操作,但它可能不会那么有效,因为您将经常构建一个新列表(或部分列表).