我需要从列表[Char]
列表中删除[[Char]]
中存储的元素。让我们拥有这些元素 - "34"
和这样的列表列表 - ["2345","16"]
。我需要做的是从列表列表中删除每个元素。这些元素中的任何一个都不会多次出现。所以我需要这样的结果 - ["25","16"]
。到目前为止,我已经提出了这个无法正常工作的解决方案:
removeFromListOfLists list toRemove = map (\element -> removeFromList list element) toRemove
removeFromList list element = map (\listPart -> remove listPart element) list
remove listPart element = filter (\e -> e/=element) listPart
但我得到的是:[["245","16"],["235","16"]]
答案 0 :(得分:2)
您自上而下组织代码的方式实际上非常好;您可以使用它来指导您的实施。让我们从:
开始removeFromListOfLists :: Eq a => [a] -> [[a]] -> [[a]]
removeFromListOfLists toRemove lol = map (\list -> removeFromList toRemove list) lol
(我已经根据你的定义翻转了参数的顺序,因为为了更容易组合和部分应用,将你正在处理的列表作为最后一个参数通常更惯用。另请注意我&#39 ; m映射列表列表,这可以说是表达此任务的更自然的方式。)
现在我们深入研究removeFromList
:
removeFromList :: Eq a => [a] -> [a] -> [a]
正如您可能怀疑的那样,可以用filter
表示:
removeFromList toRemove list = filter (\element -> shouldBeKept element) list
我们仍然需要定义shouldBeKept
测试。通过使用where
的本地定义,而不是通过顶级定义,这样做稍微方便一些:
removeFromList :: Eq a => [a] -> [a] -> [a]
removeFromList toRemove list = filter (\element -> shouldBeKept element) list
where
shouldBeKept element = element `notElem` toRemove
(这使用notElem
函数。或者,尽管有不必要的详细程度,您可以使用elem
定义shouldBeRemoved
测试,然后在调用{{1}时使用not (shouldBeRemoved element)
}}。)
为了完整起见,我通常会以更加无意义的方式(明智地"省略[ting]参数",如Stephan Strate put it in a comment)来表达这些功能:
filter
答案 1 :(得分:1)
您可以使用:
import Data.List
removeFromList items list = map handle list where
handle y = filter (`notElem` items) y
简短版本:
removeFromList items = map handle where
handle = filter (`notElem` items)
示例电话:removeFromList "34" ["2345","16"]
你的行为是,你映射整个列表,所以你分别得到每个列表。 下一步,您将折叠此特定列表并检查每个项目是否应删除。