从Haskell中的列表中删除项目
如何从Haskell中的列表中删除项目? 我有这个代码,但似乎不起作用。这个概念,我有两个列表,列表总是只有一个元素。bList将始终具有其在列表中的元素。因此,我想从bList中删除元素,并在最后输出不带该项的新列表。能给我一些提示吗? 谢谢从Haskell中的列表中删除项目,haskell,Haskell,如何从Haskell中的列表中删除项目? 我有这个代码,但似乎不起作用。这个概念,我有两个列表,列表总是只有一个元素。bList将始终具有其在列表中的元素。因此,我想从bList中删除元素,并在最后输出不带该项的新列表。能给我一些提示吗? 谢谢 removeFromList :: aList -> bList -> finalList removeFromList [] _ = [] removeFromList (y:ys) (x:xs)
removeFromList :: aList -> bList -> finalList
removeFromList [] _ = []
removeFromList (y:ys) (x:xs)
| y == x = removeFromDatabase y xs
| otherwise = y : removeFromDatabase y xs
有几个问题:
第一个列表应该包含该元素,但您似乎是从第一个子句中的第二个列表中获取该元素,因此它应该是:
removeFromList _ [] = []
其次,在进行递归调用时,需要重新创建包含单个元素的列表,即removeFromList[y]xs
第三,列表类型应该是相同的,您需要==
的Eq
约束,只要在列表中始终有一个元素,我就提出另一个解决方案:
removeFromList :: Eq a => [a] -> [a] -> [a]
removeFromList [elem] = filter (== elem)
或者,如果该元素只出现一次:
import Data.List
removeFromList [elem] = delete elem
但是请记住,如果第一个参数以某种方式显示为空或包含多个元素,那么它将失败
代码中的问题:
- 您使用的
aList
和bList
不是作为参数名,而是作为函数签名中的类型变量,它们过于通用(相当于removeFromList::a->b->c
)
- 递归调用函数时,传递的是
y
,它是单个元素,而不是列表
删除xs ys=[y | y aaaa,我可以通过草稿进行废弃。同样是+1,尽管我建议删除参数周围的列表(rfl::Eq a=>a->[a]->[a]
)我同意,但是发问者要求第一个参数是一个列表-可能这个函数已经在某个地方使用了。或者可能他们从一开始就有错误的声明:)你可以使用ys@(y:)
;removeFromList ys
,而不是每次都构建一个新的列表。
import Data.List
removeFromList [elem] = delete elem