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
我希望我的问题很清楚。
一个简单的方法是,假设您只查找相邻的重复元素:
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)
这种方法计算每个元素出现的次数,然后返回那些碰巧出现多次的元素。它们返回的顺序是未定义的。