如何只显示重复的元素?

0 haskell functional-programming

我是 Haskell 的新手。

如何只显示重复的元素?

作为输入给出:bbbool,预期输出:bo

我从互联网上找到了一种方法:

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"
Run Code Online (Sandbox Code Playgroud)

但问题是,它只会显示第一个重复的元素。例如 :bbbool = b

我希望我的问题很清楚。

Jak*_*kuJ 5

一个简单的方法是,假设您只查找相邻的重复元素:

import Data.List (group)

findRepeating :: Eq a => [a] -> [a]
findRepeating = map head . filter ((> 1) . length) . group
Run Code Online (Sandbox Code Playgroud)

您可能希望对其进行排序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
Run Code Online (Sandbox Code Playgroud)

这种方法计算每个元素出现的次数,然后返回那些碰巧出现多次的元素。它们返回的顺序是未定义的。