как показать только повторяющийся элемент? - PullRequest
0 голосов
/ 08 мая 2020

Я новичок в Haskell.

Как отображать только повторяющиеся элементы?

В качестве ввода: bbbool, ожидаемый результат: bo

Я нашел способ сделать это из inte rnet:

import qualified Data.Set as Set

dup :: Ord a => [a] -> Maybe a
dup xs = dup' xs Set.empty
  where dup' [] _ = Nothing
        dup' (x:xs) s = if Set.member x s 
                           then Just x
                           else dup' xs (Set.insert x s)

dupString :: (Ord a, Show a) => [a] -> [Char]
dupString x = case dup x of
                  Just x  -> "First duplicate: " ++ (show x)
                  Nothing -> "No duplicates"

Но проблема в том, что он покажет только первый повторяющийся элемент. например: bbbool = b

Надеюсь, что мой вопрос ясен.

1 Ответ

4 голосов
/ 08 мая 2020

Простой способ сделать это, если вы ищете только соседние повторяющиеся элементы:

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

Этот подход подсчитывает, сколько раз появляется каждый элемент, а затем возвращает те, которые случалось появляться не раз. Порядок, в котором они возвращаются, не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...