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

のそれぞれについて、結果のリストに追加しlますxsfilter (/= xs) l

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

または、内包表記をネストしてフィルターを削除します。for each xsinxssおよび for each xin は、と異なる場合にのみxs保持します。xy

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基本的に、リストで作成できるすべてのバインディングについてls、フィルタリングされたリストfを結果のリストに追加することを示しています。

于 2012-05-04T11:32:25.650 に答える