unique des éléments dans une liste haskell
bon d'accord, c'est probablement va être dans le prélude, mais: est-il une norme fonction de la bibliothèque pour trouver les éléments dans une liste? ma (re)mise en œuvre, pour la clarification, est:
has :: (Eq a) => [a] -> a -> Bool
has [] _ = False
has (x:xs) a
| x == a = True
| otherwise = has xs a
unique :: (Eq a) => [a] -> [a]
unique [] = []
unique (x:xs)
| has xs x = unique xs
| otherwise = x : unique xs
- Votre
has
est également de série, c'est justeflip elem
. - Ou même
has xs = (`elem` xs)
. - pourquoi êtes-vous à l'aide de
elem
comme infixe? - Parce que
elem
a typeEq a => a -> [a] -> Bool
afin de l'utiliser comme un infixe la section de fonctionnement faitxs
le deuxième argument.(`elem` xs)
est délactosé à(\x -> elem x xs)
qui est ce que nous voulons ici!
InformationsquelleAutor muhmuhten | 2010-06-23
Vous devez vous connecter pour publier un commentaire.
La
nub
fonction deData.List
(non, ce n'est pas vraiment dans le Prélude) n'a décidément quelque chose comme ce que vous voulez, mais il n'est pas tout à fait le même que celui de votreunique
fonction. Ils ont à la fois de préserver l'ordre original des éléments, maisunique
conserve le dernierl'apparition de chaque élément, tandis que
nub
conserve la première occurrence.Vous pouvez faire pour vous
nub
agissent exactement comme lesunique
, si c'est important (même si j'ai un sentiment qu'il n'est pas):Aussi,
nub
est seulement bon pour les petites listes.Sa complexité est quadratique, donc ça commence à devenir lent si votre liste peut contenir plusieurs centaines d'éléments.
Si vous limitez vos types de types ayant un Ord exemple, vous pouvez le faire à l'échelle de mieux.
Cette variation sur
nub
conserve l'ordre des éléments de la liste, mais sa complexité estO(n * log n)
:En fait, il a été proposé pour ajouter
nubOrd
àData.Set
.nub
n'est pas bon pour tout liste de. Même sur la liste avec les 2 élémentsnubOrd
est rapide.Ord a
. Aussi, j'ai trouvé que nubOrd curieusement (ou pas) n'est pas vraiment mieux que la bosse dans mon cas. Il a été encore plus lente. Probablement parce qu'il n'y avait pas beaucoup de valeurs en double (bien que l'introduction de nub couper l'exécution de moitié le temps, nub ord était d'environ 20% plus lent que juste nub).J'ai cherché
(Eq a) => [a] -> [a]
sur Hoogle.Premier résultat a été
partie
(supprimer les doublons d'éléments à partir d'une liste).Hoogle est génial.
nub
fonction est deData.List
paquet.Je pense que unique doit renvoyer une liste d'éléments qui n'apparaissent qu'une fois dans la liste d'origine, qui est, à tous les éléments de l'original de la liste qui apparaissent plus d'une fois ne devraient pas être inclus dans le résultat.
Puis-je suggérer une définition alternative, unique_alt:
Voici quelques exemples qui mettent en évidence les différences entre unique_alt et unqiue:
Je pense que ce serait-il le faire.
Une autre façon de supprimer les doublons:
Algorithme en Haskell pour créer une liste unique:
De sortie: