2010-09-25 8 views
3

est-il possible de créer une fonction qui créera un ensemble avec une entrée d'une liste.Haskell - Créer ensemble (liste triée unique) - aucune récursivité, aucun nub

Je ne peux tout simplement pas penser à quelque chose sans utiliser la récursivité.

Je peux utiliser des fonctions d'ordre élevé comme le pli, le filtre, la carte, le zip. Je ne peux pas avoir de récursion dans ma fonction.

Évidemment, je ne peux pas utiliser nub.

Je me suis cogné la tête en essayant de comprendre comment se débarrasser des doublons sans récursion ou tout type de boucle (au moins, je ne pense pas que nous pouvons utiliser des boucles, va demander).

+1

'nubBy (==)'. Ce n'est pas «nub» non? : p: p – kennytm

Répondre

10

Une façon de le faire:

  1. Trier la liste.
  2. Zip la liste avec la queue (par exemple, tournant dans [1,1,2,3][(1,1),(1,2),(2,3)])
  3. supprimer toutes les paires où les deux éléments sont les mêmes.
  4. Renvoie la liste contenant le premier élément de la liste triée suivi du deuxième élément de chaque paire dans la liste compressée.

Dans le code:

import Data.List 

setify [] = [] 
setify xs = x : map snd (filter (uncurry (/=)) (zip sxs (tail sxs))) 
    where sxs = sort xs 
      x = head sxs 
+0

n'aurait jamais pensé à ça. – Matt

+4

Vous ne devriez probablement pas donner le code, juste la méthode, puisque ce sont les devoirs ... – alternative

+0

Ça ne marche pas! Pensez à/essayez ce qui se passe lorsque le premier élément de la liste est le plus grand ... – yatima2975

4

Une autre solution serait d'utiliser un pli pour accumuler les valeurs avec un chèque d'adhésion si elle a été vu auparavant.

setify :: (Eq b) => [b] -> [b] 
setify = foldl f [] 
where f acc next | next `elem` acc = acc 
       | otherwise  = next:acc 

Pas la méthode la plus rapide, mais le travail est terminé.

-2

Pourquoi toutes les solutions compliquées (et fausses!)? Faites simplement ceci:

uniq [] = [] 
uniq (x:xs)= x:(uniq (filter (/=x) xs)) 

setify xs = uniq $ sort xs -- If you want to sort too. 

Il filtre chaque élément de la queue de la liste. Simple.

+3

Ceci est une solution récursive. L'OP avait l'obligation explicite de ne pas utiliser la récursivité. – hammar

+2

Voici Haskell. Il n'y a que la récursivité. Chaque réponse ici utilise la récursion (Au moins à l'intérieur trier et foldl.) Et: Si vous voulez faire Haskell sans récursion ... * vous le faites mal *. – Evi1M4chine

Questions connexes