试图解决此问题。
假设我有x = fromList [(“ a”,1),(“ b”,2),(“ c”,3)]
并有一个列表[“ a”,“ a”,“ b”,“ c”,“ c”]
我如何考虑制作类似的东西。
Map.fromList [(“ a”,2),(“ b”,2),(“ c”,6)]
任何朝着正确方向的帮助将不胜感激
答案 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"]