Подсчет элементов в списке с пониманием списка - PullRequest
2 голосов
/ 16 октября 2019

Я новичок в Haskell и пытаюсь написать простую функцию. Я хотел бы сжать каждый элемент по его предстоящей частоте.

Например, введите: "aabbcca" и я хотел бы получить результат

[('a',2), ('b',2), ('c',2), ('a',1)]

Мой код теперь выглядит следующим образом:

import Data.List

compress :: String -> [(Char, Int)]
compress n = [ (x,y) | x:xs <- group n, y <- ? ]

I'mзастрял и не знаю, как мне считать элементы. Любой совет?

1 Ответ

4 голосов
/ 16 октября 2019

Нет необходимости использовать другой генератор в вашем списке. Вы можете вычислить length :: Foldable f => f a -> Int группы xs здесь. Здесь мы используем as-pattern [zvon.org] , чтобы иметь доступ как ко всей группе, так и к первому элементу этой группы:

compress :: Eq a => [a] -> [(a, Int)]
compress n = [ (x, <b>length xs</b>) | <b>xs@</b>(x:_) <- group n ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...