我认识到这个问题有点奇怪,毕竟 Data.Map 似乎是创建频率图的正确数据结构。然而我想创建一个频率图,它实际上只是一个函数。
我成功了:
frequencyMap list =
frequencyMap' list (const 0)
where
frequencyMap' [] fun = fun
frequencyMap' (head : tail) fun =
frequencyMap'
tail
( \int ->
( if int == head
then 1 + fun int
else fun int
)
)
但是这个实现在优化部门显然是有欠缺的。我有一种感觉,有一种更优雅的方法可以使用一些时髦的功能性 thingamajig 来做到这一点。提前感谢聪明的 Haskellers。 :3
即使您希望外部可见类型不使用
Data.Map
,惯用的方法仍然是在内部使用 Data.Map
。
frequencyMap :: Ord a => [a] -> a -> Int
frequencyMap as = \a -> M.findWithDefault 0 a freqs where
freqs = M.fromListWith (+) [(a, 1) | a <- as]