Haskell: Filter-Prädikat invertieren

Problem: In Haskell möchtest du mit einem invertierten Filter-Operator filtern.

Zum Beispiel ist dein Code (GHCi):

example.hs
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.

example_negate.hs
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.


Check out similar posts by category: Haskell