Überprüfen auf alle Elemente in einem Set in Haskell mit syntaktischem Zucker

Nov 21 2020

Ich versuche, die Integer-Duplikate einer Liste von zu entfernen (String, Int), wobei mir garantiert wird, dass es keine StringDuplikate 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

2 WillNess Nov 21 2020 at 10:53

(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)].

1 Niclas Nov 23 2020 at 17:02

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.

1 dfeuer Nov 23 2020 at 22:21

Die vorhandenen Antworten nutzen nicht die Garantie, dass die Zeichenfolgen eindeutig sind oder dass sie Intgeordnet 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 ]