2017-04-03 2 views
1

Das mag trivial sein, aber ich bleibe beim Schreiben einer Funktion stecken, die eine Teilmenge einer Menge aus der Menge selbst entfernt (sie findet ihr Komplement).
Meine Funktion ist in der Form:Entfernen einer Teilmenge aus einer Menge

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

Jede Hilfe wäre sehr, wie ich Haskell bin neu geschätzt.

+1

Was ist der Zweck der Rückgabe eines 'Maybe [a]' anstelle eines einfachen '[a]'? – Franky

+0

Sie haben recht, ich sollte nur eine [a] –

+0

verwenden Diese sind keine Sätze, sie sind Listen. Wenn Sie Mengen verwenden möchten, sollten Sie 'Data.Set' verwenden, da dies die tatsächlichen Mengenbedingungen erzwingt (keine Reihenfolge, keine doppelten Elemente) und schnellere Operationen unterstützt, einschließlich' O (m * log (n/m + 1)), m <= n' setzt den Unterschied. – Lazersmoke

Antwort

3

Sie müssen Ergebnis nicht in Maybe einpacken, weil Sie immer leere Liste zurückgeben können.

einfachste Implementierung ist:

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

Nach eta reduzieren:

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

Weitere Code-Golf-Punkt frei (punktlosen) Stil, es kann auch geschrieben werden als:

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

Für eine direktere Lösung mit Rekursion können Sie immer verwenden:

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

'wenn foo dann True else bar 'ist besser geschrieben als' foo || bar'. – amalloy

Verwandte Themen