如何计算带有 Data.Map 的列表出现次数?

How to count list occurrences with a Data.Map?

有没有办法在 Haskell 中使用 Data.Map 来查找给定列表中出现的次数,无论是字符还是整数? 例如:[Int] -> Map Int Int.

如果可以实现,不使用fromList你能做到吗?

您可以生成一个 Map k Int 作为 fromListWith :: (Hashable k, Ord k) => (a -> a -> a) -> [(k, a)] -> Map k a 列表中项目的计数器。我们可以实现这样的功能:

{-# LANGUAGE TupleSections #-}

import Data.Hashable(Hashable)
import Data.HashMap(Map, fromListWith)

toCounter :: (Hashable a, Ord a) => [a] -> Map a Int
toCounter = <strong>fromListWith (+)</strong> . map (,1)

这里我们将每个元素转换为二元组,其中 1 作为二元组的第二项。如果两个键之间存在冲突,我们会通过汇总该项目出现的次数来解决此问题。

这会生成例如:

ghci> toCounter [1,4,2,5,1,3,0,2]
fromList [(0,1),(1,2),(2,2),(3,1),(4,1),(5,1)]

此处为列表 [1,4,2,5,1,3,0,2] 0345 出现一次,并且 12 出现两次。

If it's possible to achieve, would you be able to do it without the use of fromList?

是的,您可以使用 foldl' :: Foldable t => (b -> a -> b) -> b -> t a -> b and insertWith :: (Hashable k, Ord k) => (a -> a -> a) -> k -> a -> Map k a -> Map k a 。我把它留作练习,将 toCounter 函数转换为 折叠模式