[英]removing duplicates from a list in haskell
我正在嘗試刪除列表中的連續重復項; 例如,給定列表[1,2,2,3,4]
,我需要的函數必須返回[1,3,4]
。
但是,如果尾隨重復項在列表中(例如[1,2,3,4,4]
,我在問題末尾的代碼將不起作用。
我也想用盡可能簡單的術語來做,我該怎么做?
myCom :: Eq a => [a] -> [a]
myCom (x:y:ys@(z:_))
| x == y = myCom ys
| otherwise = x : myCom (y:ys)
myCom ys = ys
您的第一個模式匹配只捕獲包含至少 3 個元素的列表。 這就是為什么當重復項位於列表末尾時
myCom [4,4]
被稱為它只是使用
myCom ys = ys
並返回自身。 您可以通過為至少包含以下 2 個元素的列表定義 myCom 來捕捉這一點(無論如何您都沒有使用 z ):
myCom (x:y:ys)
| x == y = myCom ys
| otherwise = x : myCom (y:ys)
myCom ys = ys
這給
myCom [1,2,2,3,4,4] = [1,3]
3 個(奇數)連續數字仍然存在問題。 例如我們得到:
myCom [1,2,2,2] = [1,2]
但我明白這是理想的行為。
我會使用Maybe
將長度為 1 表示為成功條件。 這適用於 Haskell 的模式匹配語法。 然后,您可以使用group
(來自 Data.List)並使用catMaybe
(來自 Data.Maybe)過濾掉Nothing
s:
myCom = catMaybes . map lenOne . group
where lenOne [x] = Just x
lenOne _ = Nothing
從評論中我看到函數Data.Set.nub
只是按照 OP 的要求執行操作。
然而,我第一次嘗試解決這個問題如下,它只刪除連續的重復項(例如[1,2,1,2,1,2]
沒有改變):
concat $ filter (\x -> length x == 1) $ Data.List.group [1,2,3,4,4]
我希望這個答案對最終出現在此頁面上的一些隨機用戶有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.