Haskell使用数据构造函数过滤嵌套列表

时间:2018-02-12 05:09:10

标签: haskell

假设我有以下数据类型

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],这将被删除)

有什么想法吗?

编辑:

进一步的例子,假设我有一篮子水果碗。篮子是嵌套列表,碗是其中的列表。现在,我看看篮子里。我检查了第一个碗。我看着碗里的第一个水果,并确定我不想从任何碗里吃那些水果。所以我扔掉所有包含那种水果的碗,然后把你的篮子还给你。

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