从列表列表中删除元素 - haskell

时间:2018-03-06 13:38:51

标签: haskell

我需要从列表[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"]]

2 个答案:

答案 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"]

你的行为是,你映射整个列表,所以你分别得到每个列表。 下一步,您将折叠此特定列表并检查每个项目是否应删除。