2017-04-03 18 views
1

これは簡単なことかもしれませんが、セットのサブセットを削除する関数を書くことに固執しています。
My機能は、次の形式である:私はHaskellのに新しいですとセットからサブセットを削除する

removeSubset :: (Eq a) => [a] -> [a] -> [a] 
removeSet [] ys = Just ys 
removeSet --This is where I don't know how to remove the subset 

任意の助けをいただければ幸いです。

+1

単純な '[a]'ではなく 'Maybe [a]'を返す目的は何ですか? – Franky

+0

あなたは正しいです、私はちょうど[a]を使うべきです –

+0

これはセットではなく、リストです。セットが必要な場合は、 'O(m * log(n/m + 1))、mを含む実際のセット条件(順序は無し、重複メンバはありません) <= n'は差を設定します。 – Lazersmoke

答えて

3

空リストを常に返す可能性があるため、結果をラップする必要はありません。

実装が簡単な:ETA後

removeSet xs ys = filter (not . (`elem` xs)) ys 

低減:

removeSet xs = filter (not.(`elem`xs)) 

以上のコードゴルフポイントフリー(ポイント以下)スタイルのために、それはまた、のように書くことができます。

removeSet = filter.((not.).(flip elem)) 

再帰を使用したより直接的なソリューションでは、常に次のものを使用できます。

removeSet _ [] = [] 
removeSet [] ys = ys 
removeSet xs (y:ys)= if element y xs then removeSet xs ys else y:removeSet xs ys 
    where element x [] = False 
     element x (l:ls) = if l == x then True else element x ls 
+1

'if foo then True else bar'は' foo ||としてよく書かれます。バー。 – amalloy

関連する問題