从Haskell中的列表中删除项目

时间:2014-02-27 16:04:39

标签: haskell

如何从Haskell中的列表中删除项目? 我有这个代码,但似乎没有用。它的概念,我有2个列表,aList总是只有一个元素。 bList将始终具有其在aList中的元素。所以我想从bList中删除元素,最后输出没有该项的新列表。可以提一些提示吗? 谢谢

removeFromList :: aList -> bList -> finalList
removeFromList [] _           = []
removeFromList (y:ys) (x:xs)
                  | y == x = removeFromDatabase y xs
                  | otherwise = y : removeFromDatabase y xs 

2 个答案:

答案 0 :(得分:2)

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

有一些问题:

第一个列表应该包含该元素,但您似乎是从第一个子句中的第二个获取它,因此它应该是:

removeFromList _ [] = []

其次,您需要在进行递归调用时重新创建包含单个元素的列表,即removeFromList [y] xs

第三,列表类型应该相同,并且您需要Eq的{​​{1}}约束

答案 1 :(得分:1)

只要您总是aList中有一个元素,我就提出另一个解决方案:

removeFromList :: Eq a => [a] -> [a] -> [a]
removeFromList [elem] = filter (== elem)

或者,如果您只有一个元素出现:

import Data.List
removeFromList [elem] = delete elem

但是请记住,如果第一个参数看起来是空的或者有多个元素,它将会失败。

代码中的问题:

  • 您不使用aListbList作为参数名称,而是将其作为函数签名中的类型变量,这些变量过于笼统(相当于removeFromList :: a -> b -> c
  • 递归调用函数时,传递的y是单个元素,而不是列表。