算法 - 如何删除Haskell列表中的重复元素

Jus*_*tin 1 haskell

我在创建类似于nub函数的函数时遇到问题.

我需要这个函数来从列表中删除重复的元素.当2个元素具有相同的电子邮件时,元素被复制,并且它应该保持较新的元素(更接近列表的末尾).

type Regist = [name,email,,...,date]
type ListRe = [Regist]

rmDup ListRe -> ListRe
rmDup [] = []
rmDup [a] = [a]
rmDup (h:t) | isDup h (head t) = rmDup t
            | otherwise = h : rmDup t

isDup :: Regist -> Regist -> Bool
isDup (a:b:c:xs) (d:e:f:ts) = b==e
Run Code Online (Sandbox Code Playgroud)

问题是该函数不会删除重复的元素,除非它们在列表中一起存在.

Ano*_*on. 12

只需使用nubBy,并指定一个相等的函数,以您想要的方式比较事物.

如果你想保留最后一个元素而不是第一个元素,我想几次反转列表.


Ale*_*nov 5

稍微修改原始代码版本以使其运行:

type Regist = [String]
type ListRe = [Regist]

rmDup :: ListRe -> ListRe
rmDup [] = []
rmDup (x:xs) = x : rmDup (filter (\y -> not(x == y)) xs)
Run Code Online (Sandbox Code Playgroud)

结果:

*Main> rmDup [["a", "b"], ["a", "d"], ["a", "b"]]
[["a","b"],["a","d"]]
Run Code Online (Sandbox Code Playgroud)