查找列表中的第一个重复元素

cud*_*dle 0 haskell functional-programming

我是Haskell的新手.我试图在Haskell中编写代码,从列表中找到第一个重复元素,如果它没有重复元素,则给出消息没有重复.我知道我可以通过nub功能来做到这一点,但我试图在没有它的情况下做到这一点.

dby*_*rne 6

这是一种方法:

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"

main :: IO ()
main = do
       putStrLn $ dupString [1,2,3,4,5]
       putStrLn $ dupString [1,2,1,2,3]
       putStrLn $ dupString "HELLO WORLD"
Run Code Online (Sandbox Code Playgroud)

下面是它的工作原理:

*Main> main
No duplicates
First duplicate: 1
First duplicate: 'L'
Run Code Online (Sandbox Code Playgroud)

  • 如果你*必须*为他做OP的家庭作业,至少礼貌地解释你的过程提出解决方案或启发超出裸代码的问题(这可能也是他的外语).-1 (3认同)
  • @luqui 其他人已经发布了一个答案,基本上是说“你尝试了什么?发布一些代码”。此答案已被删除。这是你的主观意见,不值得回答。很好,但我认为确实如此。OP 的要求非常清楚,因此很容易提供正确的答案。我自己是一个 Haskell 初学者,并且认为尝试一下是一个很好的实践。一旦我想出了解决方案,不发布它似乎很愚蠢。 (2认同)