在 haskell 中创建真实频率图的惯用方法是什么(不使用 Data.Map)?

问题描述 投票:0回答:1

我认识到这个问题有点奇怪,毕竟 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

haskell functional-programming
1个回答
0
投票

即使您希望外部可见类型不使用

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]
© www.soinside.com 2019 - 2024. All rights reserved.