如何计算带有 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]
0
、3
、4
和 5
出现一次,并且 1
和 2
出现两次。
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
函数转换为 折叠模式 。
有没有办法在 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]
0
、3
、4
和 5
出现一次,并且 1
和 2
出现两次。
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
函数转换为 折叠模式 。