2012-05-04 14 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 []'をエラーとするのはなぜですか? 'remove y [[]]'と 'remove y [[y + 1]]'はエラーではありませんか? – dave4420

+0

ありがとうございました。私はそれらのエラーを追加しますありがとうありがとう:) – Moe

+5

@Mike:あなたはそれらをエラーにするべきではありません。空のリストから 'y'を削除すると、空のリストのままです。この場合、関数は合計でなければなりません。エラーは使用するのが難しくなります。 –

答えて

5

、結果リストにfilter (/= xs) lを追加:入れ子内包して、フィルターを除去

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

または、。 xssにおける各xxsでは、各xsに対して 、yからそれは違う場合にのみxを保つ:

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

あなただけの練習をしている場合、それはOKですが、mapとバージョンがずっといいです:)

2

をありがとうござい同じ使用して、リストの内包表記を行うことができるようになります。

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

は問題ないはずです。

基本的には、すべてのバインディングlに対してリストlsを作成し、フィルタリングされたリストfを結果リストに追加することが基本的に記載されています。 xslについて

+0

ありがとうございます、それほど頼りすぎないと簡単に説明できます。 – Moe

+0

@Mike:リカルドの答えを見て、それは良いです:] – m09

+0

@マイケル:私は短い説明を追加 – m09

関連する問題