Überprüfen auf alle Elemente in einem Set in Haskell mit syntaktischem Zucker
Ich versuche, die Integer-Duplikate einer Liste von zu entfernen (String, Int)
, wobei mir garantiert wird, dass es keine String
Duplikate gibt.
Ist es möglich, so etwas in Haskell zu bewerten:
Ich habe es versucht:
[(a,b) | (a,b) <- bs, (c,k) <- bs, ((k == b) <= (a == c))]
das funktioniert aber noch nicht.
Bearbeiten: Mir ist klar, dass Sie dies mit einer komplexeren Syntax erreichen können. Zum Beispiel durch rekursives Durchsuchen der Liste nach Duplikaten für jedes Element ...
Antworten
(NB: Dies ist eine völlig neue Version dieser Antwort. Die vorherige war völlig falsch.)
Um Ihr mathematisches Mengenverständnis genauer zu verfolgen, können wir die Definition in Ihrer Antwort als anpassen
uniquesOnly :: (Eq a, Eq b) => [(a, b)] -> [(a, b)]
uniquesOnly bs =
[(a,b) | (a,b) <- bs,
[(c,d) | (c,d) <- bs, d == b] ==
[(a,d) | (c,d) <- bs, d == b]]
"für alle (c, d) in bs, so dass d == b folgt c == a".
uniquesOnly [(1,1),(2,2),(3,1)]
kehrt zurück [(2,2)]
.
Dies ist eine mögliche Lösung:
Zum Beispiel habe ich diese äquivalente Aussage gemacht:
removeDuplicates :: [(String, Int)] -> [(String, Int)]
removeDuplicates bs =
[(a,b) | (a,b) <- bs,
length [(c,d) | (c,d) <- bs, d == b] == 1]
Dies ist jedoch nicht dieselbe Aussage, sondern nur eine gleiche.
Die vorhandenen Antworten nutzen nicht die Garantie, dass die Zeichenfolgen eindeutig sind oder dass sie Int
geordnet sind. Hier ist eine, die es tut.
import Data.List (sortBy, groupBy)
import Data.Function (on)
uniquesOnly :: Ord b => [(a, b)] -> [(a, b)]
uniquesOnly ps
= [ p
| [p] <- groupBy ((==) `on` snd) .
sortBy (compare `on` snd) $ ps ]