我有这个函数可以删除列表列表中给定元素的出现。
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
我怎样才能使用列表理解
来做同样的事情谢谢
答案 0 :(得分:5)
对于l
中的每个xs
,将filter (/= xs) l
添加到结果列表中:
remove y xs = [filter (/= y) l | l <- xs]
或者,通过嵌套理解去除过滤器。
对于xs
中的每个xss
以及x
中的每个xs
,仅当x
与y
不同时,请保留remove y xss = [ [x| x <- xs, x /= y] | xs <- xss]
:
map
如果你只是练习就没关系,但你的版本{{1}}更好:)
答案 1 :(得分:2)
我想的是:
remove y ls = [f|l <- ls, let f = filter (/= y) l]
应该没问题。
它基本上声明,对于您可以在列表l
中创建的每个绑定ls
,将过滤后的列表f
添加到结果列表中。