有沒有辦法Data.Map在 Haskell 中使用來查找給定串列中出現的次數,無論是字符還是整數?例如:[Int] -> Map Int Int。
如果可以實作,您是否可以不使用fromList?
uj5u.com熱心網友回復:
您可以使用 生成一個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 = fromListWith ( ) . map (,1)
在這里,我們將每個元素轉換為 2 元組,1并將其作為2 元組的第二項。如果兩個鍵之間存在沖突,我們通過總結該專案出現的次數來解決這個問題。
這會產生例如:
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, 4and5出現一次,1and2出現兩次。
如果可以實作,您是否可以不使用
fromList?
是的,您可以使用foldl' :: Foldable t => (b -> a -> b) -> b -> t a -> b和insertWith :: (Hashable k, Ord k) => (a -> a -> a) -> k -> a -> Map k a -> Map k a 。我把它作為一個練習來將toCounter函式轉換為折疊模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339380.html
