2009-05-11 6 views
3

J'ai un 2 listes de chaînes
par exemple:comparer le contenu de chaîne dans haskell

listx = ["name","age","rank"] 
input = ["name","age"] 

Comment puis-je comparer les deux listes pour vérifier si le listx contient "name" & "age" donné en input?

Répondre

4

Est-ce que ce sont les devoirs? :)

Vous devez créer une ou deux fonctions récursives pour parcourir les deux listes et rechercher chaque chaîne dans l'entrée.

Ou, vous pouvez rechercher quelques bonnes fonctions dans le Prelude qui aide ici. Il me vient en tête.

+1

Oui, je suis nouveau à haskell. J'ai essayé mais j'ai une erreur. inputIndex :: [chaîne] -> [chaîne] -> Bool inputIndex [] _ ​​= [] entrée Listx inputIndex = [x 'elem' Listx | x <- entrée] erreur: - erreur de type dans liaison explicitement typée *** Terme: inputIndex *** Type: [Chaîne] -> [Chaîne] -> [a] *** Ne correspond pas: [Chaîne] -> [Chaîne] -> Bool – pier

+1

@ DLNA: votre fonction renvoie une liste de Booléens, un pour chaque x. Alors que vous voulez juste un Bool, qui est logique et de tous, donc une chose que vous pourriez faire est "inputIndex listx entrée = et [x' elem' listx | x <- entrée] " – newacct

+0

Yup. Te voilà. 'et' est ce que vous devez réduire [Bool] -> Bool. – Macke

5
all (flip elem listx) input 

vient à l'esprit. Aucune idée efficace, il est bien ...

+0

merci cela a fonctionné. comment coule-t-il exactement? merci – pier

+2

vous pouvez aussi l'écrire comme "all (' elem' listx) input ". @dlna: fondamentalement, il s'étend à "all (\ x -> x' elem' listx) input ", ce qui garantit que pour chaque élément d'entrée, c'est un élément de listx – newacct

6

B est un sous-ensemble de A ssi B \ A est vide

donc une autre façon de le faire est

import Data.List ((\\)) 
null (input \\ listx) 
4

Une autre façon.

import Data.Set 
(fromList input) `isSubsetOf` (fromList listX) 
Questions connexes