Vérification de tous les éléments d'un ensemble dans Haskell à l'aide du sucre syntaxique
J'essaie de supprimer les doublons entiers d'une liste de (String, Int)
, où je suis assuré qu'il n'y a pas de String
doublon.
Est-il possible d'évaluer quelque chose comme ça dans Haskell:
J'ai essayé:
[(a,b) | (a,b) <- bs, (c,k) <- bs, ((k == b) <= (a == c))]
mais cela ne fonctionne pas encore.
Edit: Je suis bien conscient que vous pouvez y parvenir en utilisant une syntaxe plus complexe. Par exemple en recherchant récursivement dans la liste chaque élément en double ...
Réponses
(NB: il s'agit d'une toute nouvelle version de cette réponse. La précédente était totalement décalée.)
Pour suivre de plus près votre compréhension des ensembles mathématiques, nous pouvons modifier la définition de votre réponse comme
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]]
"pour tout (c, d) dans bs tel que d == b il suit c == a".
uniquesOnly [(1,1),(2,2),(3,1)]
revient [(2,2)]
.
Voici une solution possible:
Par exemple, j'ai inventé cette déclaration équivalente:
removeDuplicates :: [(String, Int)] -> [(String, Int)]
removeDuplicates bs =
[(a,b) | (a,b) <- bs,
length [(c,d) | (c,d) <- bs, d == b] == 1]
Mais ce n'est pas la même affirmation mais égale.
Les réponses existantes ne profitent pas de la garantie que les chaînes sont uniques ou du fait qu'elles Int
sont ordonnées. En voici un qui le fait.
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 ]