Haskell: Filter-Prädikat invertieren
Problem: In Haskell möchtest du mit einem invertierten Filter-Operator filtern.
Zum Beispiel ist dein Code (GHCi):
Prelude> import Data.List
Prelude Data.List> filter ( isPrefixOf "a" ) ["a","ab","cd","abcd","xyz"]
["a","ab","abcd"]Die Liste, die du benötigst, ist ["cd","yz"]. In einigen Fällen wäre die einfachste Lösung, z.B. <= statt > zu verwenden, aber es gibt nicht für alle Funktionen ein literales Komplement, wie zum Beispiel für isPrefixOf, das im Beispiel verwendet wird.
Lösung:
Du kannst einfach die not-Funktion komponieren (Komposition erfolgt durch den Kompositionsoperator .), um das Ergebnis des Prädikats zu negieren.
Prelude> import Data.List
Prelude Data.List> filter ( not . isPrefixOf "a" ) ["a","ab","cd","abcd","xyz"]
["cd","xyz"]Beachte, dass not isPrefixOf "a" (beachte den fehlenden Kompositionsoperator) nicht funktioniert, da du not auf eine curried-Funktion anwendest. not kann nur auf einen Bool angewendet werden.
Eine detaillierte, allgemeinere (aber deutlich komplexere) Lösung wird in diesem StackOverflow-Beitrag beschrieben.