2012-05-04 63 views
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 

我怎麼能夠做同樣的使用列表理解

謝謝

+0

爲什麼'刪除y []'錯誤,例如'刪除y [[]]'和'刪除y [[y + 1]]'是不是錯誤? – dave4420

+0

謝謝戴夫我會添加這些erros謝謝:) – Moe

+5

@Mike:你不應該讓他們錯誤。如果你從空列表中刪除'y',它仍然是一個空列表...在這種情況下,函數應該是全部的,錯誤只會使它更難使用。 –

回答

5

對於xs每個l,添加filter (/= xs) l到所得的列表:

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

,或者通過嵌套推導除去過濾器。 對於xss併爲每個xxs每個xs,保持x只有當它的不同y

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

這是確定的,如果你只是在練習,但你的版本map是更好的方式:)

2

我想沿着線的東西:

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

應該罰款。

它基本上規定,對於每個綁定l,你可以在列表ls中添加過濾列表f到結果列表中。

+0

非常感謝,如果問得不多,可以簡單解釋一下。 – Moe

+0

@Mike:查看Riccardo的回答,更好:] – m09

+0

@Mike:我加了一個簡短的解釋 – m09