使用“ keys”从fromList创建新的fromList

时间:2020-08-09 21:24:55

标签: haskell

试图解决此问题。

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

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

我如何考虑制作类似的东西。

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

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

1 个答案:

答案 0 :(得分:3)

我从K. A. Buhr's comment中的假设开始,您想要获得原始哈希值和源自输入列表的哈希值的乘积。

为此,我们需要一个函数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"]

Live example on Wandbox

相关问题