假设我有一个像计数频率值
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