假设我有一个像
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
功能。 - 它要求调用者在第一个参数中指定所有可能的值。
有没有办法改善这一点?