[英]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.