簡體   English   中英

使用Haskell中的遞歸和模式匹配刪除重復列表元素

[英]Remove repeating list elements using recursion and pattern matching in Haskell

我正在創建一個函數來刪除列表中連續出現兩次或多次的元素。 它會替換它們一次。 我只使用遞歸和模式匹配(沒有庫列表函數)。

該函數應如何工作的示例:

  • unrepeat [True,True,True,True] - > [True]
  • unrepeat [1,1,2,1,3,3,3] - > [1,2,1,3]

到目前為止我所擁有的:

unrepeat :: Eq a => [a] -> [a]
unrepeat [] = []
unrepeat [x] = [x]
unrepeat (x:xs) = x : [ k | k <- unrepeat(xs), k /=x]

我相信你的實現將刪除列表中的所有重復項,看起來你只想在列表中保留一個元素,如果它不等於下一個元素。

嘗試一下:

unrepeat :: Eq a => [a] -> [a]
unrepeat [] = []
unrepeat [x] = [x]
unrepeat (x1:x2:xs) = if x1 == x2 then unrepeat(x2:xs) else x1:unrepeat(x2:xs)

好吧,我有三個,一個標准遞歸,一個foldr遞歸和一個列表理解。 每個都與包括布爾在內的任何列表完全相同。

首先,標准遞歸

rd [] = []; rd (x:xs) = x: rd (filter (/=x) xs)

這非常有效。 它通過過濾掉匹配來減少列表的最后一個列表。

減少有助於折疊。

rd2 ls = foldr (\x acc -> x:filter (/=x) acc) [] ls

foldr器與之前的rd完全相同。 它更簡潔,因為暫停條件是隱含的,列表的結尾。

列表理解也隱含地停止了。

rd3 ls = [d|(z,d)<- zip [0..] ls,notElem d $ take z ls]

刪除連接列表中的重復項是union函數。 這些都可以在沒有進口的情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM