Haskell问题

时间:2010-11-03 23:19:25

标签: haskell

我坚持这个练习。任何帮助,将不胜感激!提前谢谢!

函数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)

1 个答案:

答案 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))