假设我有以下数据类型
msum
我有一个函数定义(注意我不能改变这个定义,或者以任何方式在它周围工作。我必须使用嵌套列表并以某种方式修改它)
data Number = Positive Integer | Negative Integer
deriving (Eq, Show)
所以我们有一个嵌套的Number列表。一个例子是
removePos :: [[Number]] -> [[Number]]
如何编写removePos以便删除嵌套列表中包含Positive x的所有列表,其中x是A SPECIFIC Integer?该函数基本上是查看第一个列表中的第一个元素,如果它是Positive,则删除包含Positive x的所有列表。
基本上,如果我们看一下上面的例子,那么输出就是
[[Positive 1, Negative 1], [Positive 2, Negative 2, Positive 1], [Positive 1]]
请注意,用户执行以下函数调用
[[]]
由于上面嵌套列表中的每个列表都包含Positive 1,因此输出只是一个空的嵌套列表(所有带有Positive x的列表都被删除)。但是,如果第一个列表中的第一个元素为正10,则输出为
removePos [[Positive 1, Negative 1], [Positive 2, Negative 2, Positive 1], [Positive 1]]
(因为第一个列表会有[正10,负1],这将被删除)
有什么想法吗?
编辑:
进一步的例子,假设我有一篮子水果碗。篮子是嵌套列表,碗是其中的列表。现在,我看看篮子里。我检查了第一个碗。我看着碗里的第一个水果,并确定我不想从任何碗里吃那些水果。所以我扔掉所有包含那种水果的碗,然后把你的篮子还给你。
答案 0 :(得分:2)
一种方法是在嵌套列表上进行模式匹配,以查看第一个列表的第一个元素,以确定需要过滤的内容:
-- Note you could give this the more general type Eq a => [[a]] -> [[a]]
-- (as well as a more appropriate name)
removePos :: [[Number]] -> [[Number]]
removePos [] = [] -- Empty list case.
removePos xss@[[]:_] = xss -- If the first inner list is empty,
-- return the whole thing unchanged
removePos ((x:_):xss) = filter (notElem x) xss