2017-10-10 5 views
0

J'essaie donc de créer une fonction qui prend une liste de mots et retourne les anagrammes dans une nouvelle liste. C'est ce que j'ai jusqu'à présent:Création d'une fonction de vérification des anagrammes dans Haskell

quicksort :: Ord a => [a] -> [a] 
quicksort []  = [] 
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) 
    where 
     lesser = filter (< p) xs 
     greater = filter (>= p) xs 

sub(a,[]) = [] 
sub(a,b:c) = if a == b then c else b:(sub(a,c)) 

sublist([],a) = a 
sublist(a:b,c) = sublist(b,sub(a,c)) 

anagram a b = quicksort (a) == quicksort (b) 

find a,[] = nil 
find (a, b:c) = if anagram a b then b:(find(a,c)) else find(a,c) 

listana [] = nil 
listana (a:c) = list:(listana(sublist(list,a:c))) 
       where list = a:(find(a,c)) 

Je suis assez sûr qu'il y a un problème avec ma fonction de recherche. Oh et je suis nouveau à Haskell alors s'il vous plaît allez-y doucement sur moi.

+0

Essayez d'ajouter des signatures de type explicites à vos fonctions. Les messages d'erreur de GHC devraient (espérons-le) vous aider à trouver le problème avec votre code. De plus, dans Haskell, vous pouvez écrire une fonction avec 2 arguments ('f :: (a, b) -> c') comme fonction carrée (' f :: a -> b -> c') – cdk

Répondre

1

Bon début!

Le changement minimal nécessaire pour faire de cette compilation est de remplacer nil avec [] partout, et pour envelopper des parenthèses autour de l'argument find. Donc:

-- change one 
find (a,[]) = [] 

-- change two 
listana [] = [] 

De nombreuses améliorations sont disponibles à partir de là. Je vous encourage à parcourir le module Data.List et de voir si l'une des fonctions implémentées ici semble utile. Il existe également une astuce standard qui utilise Data.Map pour regrouper les éléments qui en font un doublage; Voir another answer of mine pour un indice.