所以我有這個功能......
removeDuplicate :: [CustomType] -> [CustomType]
removeDuplicate [] = []
removeDuplicate [x] = [x]
removeDuplicate [x, y] =
if x==y then [x]
else [x, y]
removeDuplicate (x:y:xs) =
if x==y
then removeDuplicate ([x] xs)
else removeDuplicate ([y] xs [x])
在這里,我必須檢查陣列中是否有一個元素(已排序)與陣列中的其他元素相等。
我無法處理此功能的終止條件。它只是在這里進入無限回圈。
通常,對于這種情況,我可以使用已訪問的陣列或計數,但我是 Haskell 的新手,我不確定處理這種情況的方法是什么。
PS如果需要任何其他細節,請告訴我。
uj5u.com熱心網友回復:
removeDuplicate ([y] xs [x])不會減少陣列的大小,因此最終會繼續回圈串列。事實上,如果你有一個 list [1,2,4],它會被呼叫removeDuplicate [1,2,4], thenremoveDuplicate [2,4,1]和 then removeDuplicate [4,1,2],removeDuplicate [1,2,4]這樣會不斷重復。
您應該確保每次都在較小的串列上作業。這可以通過發出
removeDuplicate :: Eq a => [a] -> [a]
removeDuplicate [] = []
removeDuplicate [x] = [x]
removeDuplicate (x:xs@(y:_))
| x == y = removeDuplicate xs
| otherwise = x : removeDuplicate xs
如果這些是“鄰居”,這只會過濾掉重復項,因此您可以例如對串列進行排序作為預處理步驟。
如果要處理可能在任何位置出現重復的串列,則應使用累加器來跟蹤已看到的專案:
removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates = go []
where go _ [] = []
go seen (x:xs)
| x `elem` seen = …
| otherwise = …
我把這些…部分作為練習留在那里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506257.html
標籤:哈斯克尔
