Vérification de tous les éléments d'un ensemble dans Haskell à l'aide du sucre syntaxique

Nov 21 2020

J'essaie de supprimer les doublons entiers d'une liste de (String, Int), où je suis assuré qu'il n'y a pas de Stringdoublon.

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

2 WillNess Nov 21 2020 at 10:53

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

1 Niclas Nov 23 2020 at 17:02

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.

1 dfeuer Nov 23 2020 at 22:21

Les réponses existantes ne profitent pas de la garantie que les chaînes sont uniques ou du fait qu'elles Intsont 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 ]