我坚持这个练习。任何帮助,将不胜感激!提前谢谢!
函数takeS获取对的列表并比较对的第一个元素。如果它们不相等,则该函数返回该对列表。如果他们是平等的,那就意味着他们有冲突。该函数将删除这两对中的任何一对并返回没有冲突对的列表。如果返回列表仍然存在一些冲突对,则函数会递归调用自身,直到没有冲突对为止。
takeS :: [(a,b)] -> [(a,b)]
示例:takeS [("a",1),("b",2),("b",3),("c",4),("c",5)]
将返回
[("a",1),("b",2),("c",4)]
,因为有两个冲突对:("b",2)
,("b",3)
和("c",4)
,("c",5)
。
答案 0 :(得分:1)
import Data.List (nubBy)
takeS :: Eq a => [(a, b)] -> [(a, b)]
takeS = nubBy $ \(x, _) (y, _) -> x == y
如果您不想导入任何内容,可以自己定义nubBy
;这是一种可能的实现(可能效率低于官方版本):
-- nubBy removes "duplicates" as defined by a binary predicate
nubBy :: (a -> a -> Bool) -> [a] -> [a]
nubBy f [] = []
nubBy f (x:xs) = x:(nubBy f (filter (not . f x) xs))