Предположим, у меня есть перечисление какПодсчет частоты перечисления значений
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
@ is7s: Первый аргумент - это список, содержащий все возможные значения (в основном, чтобы узнать, сколько их есть). – Philipp