3

我有这个函数可以删除列表列表中给定元素的出现。

remove          :: Eq a => a -> [[a]] -> [[a]]
remove    y []  = error "Can't remove an element from an empty list"
remove    y xs  = map (filter(/=y)) xs

我如何能够使用列表理解做同样的事情

谢谢

4

2 回答 2

5

对于每个lin xs,添加filter (/= xs) l到结果列表中:

remove y xs = [filter (/= y) l | l <- xs]

或者,通过嵌套理解删除过滤器。对于 each xsinxss和 for each xin xsx仅当它不同于 时才保留y

remove y xss = [ [x| x <- xs, x /= y] | xs <- xss]

如果你只是在练习也没关系,但你的版本map要好得多:)

于 2012-05-04T11:37:55.533 回答
2

我猜大概是这样的:

 remove y ls = [f|l <- ls, let f = filter (/= y) l]

应该没事。

它基本上指出,对于l您可以在 list 中进行的每个绑定ls,将过滤后的列表添加f到结果列表中。

于 2012-05-04T11:32:25.650 回答