我有这个函数可以删除列表列表中给定元素的出现。
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
我如何能够使用列表理解做同样的事情
谢谢
我有这个函数可以删除列表列表中给定元素的出现。
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
我如何能够使用列表理解做同样的事情
谢谢
对于每个l
in xs
,添加filter (/= xs) l
到结果列表中:
remove y xs = [filter (/= y) l | l <- xs]
或者,通过嵌套理解删除过滤器。对于 each xs
inxss
和 for each x
in xs
,x
仅当它不同于 时才保留y
:
remove y xss = [ [x| x <- xs, x /= y] | xs <- xss]
如果你只是在练习也没关系,但你的版本map
要好得多:)
我猜大概是这样的:
remove y ls = [f|l <- ls, let f = filter (/= y) l]
应该没事。
它基本上指出,对于l
您可以在 list 中进行的每个绑定ls
,将过滤后的列表添加f
到结果列表中。