次のような列挙型があるとします
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
これは機能しますが、少なくとも 2 つの問題があります。
- 機能を利用してい
length
ます。 - 呼び出し元は、最初の引数ですべての可能な値を指定する必要があります。
これを改善する方法はありますか?