假設我有一個像計數頻率值
data T = A | B | C deriving (Enum)
一個枚舉和輸入枚舉值的列表:
[B, C, C, A, C, A, C]
我正在尋找的是,鑑於這樣的功能輸入,返回每個元素在輸入中出現的頻率。輸出的簡單形式是頻率列表(在這種情況下爲[2, 1, 4]
),但這不是要求。我目前的做法是這樣的:
countEnum :: Enum a => [a] -> [a] -> [Word]
countEnum elems =
let f x = map (fromIntegral . fromEnum . (fromEnum x ==)) [0 .. length elems - 1]
in foldr (zipWith (+)) (replicate (length elems) 0) . map f
這工作,但我看到至少有兩個問題:
- 它使用
length
功能。 - 它要求調用者在第一個參數中指定所有可能的值。
有沒有辦法改善這種情況?
是類型聲明錯誤有鍵值對?爲什麼'countEnum'需要兩個輸入? – is7s 2012-04-08 17:50:12
@ is7s:第一個參數是一個包含所有可能值的列表(主要是爲了找出有多少個值)。 – Philipp 2012-04-08 18:21:42