Простой способ сделать это, если вы ищете только соседние повторяющиеся элементы:
import Data.List (group)
findRepeating :: Eq a => [a] -> [a]
findRepeating = map head . filter ((> 1) . length) . group
Вы можете захотеть упорядочить его с помощью nub
, чтобы иметь дело с повторяющимися элементами, поскольку для «bbbXaaaXbbb "он возвращает" bab ".
Изменить: если вы имели в виду все повторяющиеся элементы, это должно выполняться:
import qualified Data.Map as M
findRepeating :: (Foldable k, Ord a) => t a -> [a]
findRepeating = M.keys . M.filter (> 1) . foldr (\x acc -> M.insertWith (+) x 1 acc) M.empty
Этот подход подсчитывает, сколько раз появляется каждый элемент, а затем возвращает те, которые случалось появляться не раз. Порядок, в котором они возвращаются, не определен.