首页 > 解决方案 > 使用“键”从 fromList 创建新的 fromList

问题描述

试图找出解决这个问题的方法..

假设我有 x = fromList[("a", 1), ("b", 2), ("c", 3)]

并有一个列表 ["a", "a", "b", "c" , "c"]

我怎么会考虑生产类似的东西..

Map.fromList[("a", 2), ("b", 2), ("c", 6)]

任何朝着正确方向的帮助将不胜感激

标签: haskell

解决方案


我从KA Buhr 评论中的假设开始,即您希望获得原始哈希中的计数与源自输入列表的哈希的乘积。

为此,我们需要一个occurrences将字符串列表转换为从字符串到出现次数的哈希的函数。这可以使用insertWith函数轻松完成,如果存储值存在,则使用给定操作将要插入的值与存储值结合起来,否则只插入。

为了将出现次数与现有散列相乘,我们使用unionWith函数,其工作方式类似于insertWith如果元素同时存在于散列中或仅插入,则使用给定操作形成联合。

{-# OPTIONS_GHC -Wall #-}

import Data.Map

x :: Map String Int
x = fromList [("a", 1), ("b", 2), ("c", 3)]

occurrences :: Ord k => [k] -> Map k Int
occurrences l = aux l empty
  where
    aux [] h = h
    aux (a:as) h = aux as $ insertWith (+) a 1 h

main ::  IO ()
main = print $ unionWith (*) x $ occurrences ["a", "a", "b", "c", "c"]

Wandbox 上的实时示例


推荐阅读