首页 > 解决方案 > 从子列表中删除

问题描述

我正在尝试使用高阶函数从子列表中删除一个数字(如果存在)。

removeAux :: Int -> [[Int]] -> (Int -> [Int] -> Bool) -> [[Int]]
removeAux num (l:ls) f 
  | f num l = delete num l  -- ERROR in this line
  |otherwise = removeAux num ls f

removeFromSublists :: Int -> [[Int]] -> [[Int]]
removeFromSublists _ [[]] = [[]]
removeFromSublists num ls = removeAux num ls (elem)

它应该像这样工作:

> l = [[0,1,2],[2,3]]

> removeFromSublists 1 l
[[0,2],[2,3]]

> removeFromSublists 0 l  $ removeFromSubLists 1 l
[[2],[2,3]]

> removeFromSublists 2 l
[[0,1],[3]]

但是我有两个问题我不知道如何解决。首先它不会删除所有出现的数字,它应该吗?而且我不明白为什么代码不起作用?我不断收到错误:

在此处输入图像描述

有人能帮助我吗?

标签: haskell

解决方案


在这里采用类型驱动的方法可能会有所帮助。如,您想从元素列表中删除所有出现的某个元素。

这是,“给定一个( ) 的a列表,返回一个a's( )的列表:[[a]]a[[a]]

removeAll :: Eq a => a -> [[a]] -> [[a]]
removeAll v (list:listOfLists) = ???

我们正在从列表中的v每个中删除所有内容。另一种说法是“for each in our filter out list(list:listOfLists)listlistOfListsv

因此,我们希望对列表中的每个值执行相同的操作(过滤器)。在 Haskell 中,这转化为将过滤器操作映射list.listOfLists

removeAll :: Eq a => a -> [[a]] -> [[a]]
removeAll v xs = map (filter (/= v)) xs

推荐阅读