我将不得不创建一个名为removeList的递归函数。任何人都可以帮助我吗?
答案 0 :(得分:3)
makeList
是常规函数,而不是数据构造函数,因此您无法对其进行模式匹配。您需要在Cons
和Nil
上进行模式匹配;该列表由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)
为了好玩,让我们概括一下这段代码,以便它可以作为removeFirst
和removeAll
的基础:
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
即可。要删除所有出现次数,请递归。