2017-09-22 4 views
1

Je l'indice [Int] et [[String]], maintenant, je veux seulement garder le [String] qui correspondent à l'indice:indexation avec [Int] et [[chaîne]] Haskell

[0,1,4] et [[a,a,a],[b,b,b],[c,c,c],[d,d,d],[e,e,e],[f,f,f]]

donnerait [[a,a,a],[b,b,b],[e,e,e]]

Alors [Int] -> [[String]] -> [[String]]

Comment pourrais-je faire cela?

J'ai essayé map (!!) (x y)

où x est le [[chaîne]] et y est la [Int]

+6

Veuillez montrer votre propre tentative. Explique ce qui ne marche pas, etc. –

+0

Je l'ai ajouté –

Répondre

5

Peut-être que vous cherchez quelque chose comme ceci:

foo :: [Int] -> [[String]] -> [[String]] 
foo indices strings = map (strings !!) indices 

Le type peut également être généralisé à

foo :: [Int] -> [a] -> [a] 

puisque nous n'avons pas besoin d'une liste-o f-listes.

Ce n'est pas très efficace. Cela peut être grandement amélioré si l'on peut supposer que les indices augmentent, par exemple.

2

Je suppose que l'utilisation des listes de compréhension est un moyen expressif pour ce travail. Donc selon le commentaire de @ Centril, je suis d'accord pour dire qu'il s'agit d'une version monadique de la même chose;

gs :: [Int] -> [[String]] -> [[String]] 
gs is css = zip [0..] css >>= \(ix,cs) -> guard (ix `elem` is) >> return cs 

*Main> gs [0,1,4] [["a","a","a"],["b","b","b"],["c","c","c"],["d","d","d"],["e","e","e"],["f","f","f"]] 
[["a","a","a"],["b","b","b"],["e","e","e"]] 
+0

Je m'opposerais à l'utilisation de la liste de compréhension - ce n'est pas très idiomatique Haskell car ce n'est pas de la composition. Utilisez 'map, filter, fold, >> =' combinateurs à la place. – Centril

+0

@Centril Je suis totalement d'accord. Permettez-moi d'ajouter une version monadique ... – Redu

+1

@Centril Je dirais qu'il n'est pas toujours prudent de maximiser la compositionnalité. La compréhension des listes a tendance à être très intuitive à comprendre. Parfois les idéaux de Python sont meilleurs que ceux d'Haskell, même en écrivant Haskell ... – leftaroundabout