从列表中删除元素

时间:2016-10-23 20:39:16

标签: haskell recursion functional-programming pattern-matching

我将不得不创建一个名为removeList的递归函数。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

makeList是常规函数,而不是数据构造函数,因此您无法对其进行模式匹配。您需要在ConsNil上进行模式匹配;该列表由makeList返回的事实无关紧要。

removeList :: Eq a => a -> List a -> List a
removeList _ Nil = Nil
removeList x (Cons y ys) | x == y = ys -- Don't recurse if you only want to remove the *first* occurrence.
                         | otherwise = Cons y (removeList x ys)

您可以直接使用List类型;没有必要将结果构建为内置列表,然后再将其转换。

与内置列表中实现的相同函数进行比较,类型构造函数[]和数据构造函数(:)在前缀位置而不是中缀位置使用。

removeList' :: Eq a => a -> [] a -> [] a
removeList' _ [] = []
removeList' x ((:) y ys) | x == y = ys
                         | otherwise = (:) y (removeList' x ys)

为了好玩,让我们概括一下这段代码,以便它可以作为removeFirstremoveAll的基础:

removeGeneric :: Eq a => (List a -> List a) -> a -> List a -> List a
removeGeneric _ _ Nil = Nil
removeGeneric f x (Cons y ys) | x == y = f y ys
                              | otherwise = Cons y (removeGeneric f x ys)

removeFirst = removeGeneric (\y ys -> ys)
removeAll = removeGeneric removeAll

removeGeneric的第一个参数是您第一次找到匹配项时在列表中调用的函数。要删除第一个匹配项,只需调用等效的tail即可。要删除所有出现次数,请递归。