23 votes

Obtenir une sous-liste en Haskell

C'est probablement une question facile, mais j'ai parcouru la documentation et cherché des exemples sur Google et je ne suis toujours pas sûr de la réponse.

Si j'ai une liste comme ça :

[1,2,3,4,5,6,7,8,9,0]

et je veux extraire une tranche, disons de l'indice 4 à l'indice 8 c'est-à-dire que je veux :

[5,6,7,8,9]

Quelle est la façon idiomatique de faire cela en Haskell ?

38voto

ibid Points 2837

Tout d'abord, ce n'est pas un tableau, c'est une liste. Je ne suis pas (simplement) pédant, car les tableaux sont beaucoup plus problématiques en Haskell que les listes.

Cela dit, une méthode courante consiste à utiliser take y drop ensemble :

Prelude> drop 4 . take 9 $ [1,2,3,4,5,6,7,8,9,0]
[5,6,7,8,9]
Prelude> take (9-4) . drop 4 $ [1,2,3,4,5,6,7,8,9,0]
[5,6,7,8,9]

Ce dernier est un peu plus efficace.

9voto

Dan Burton Points 26639

Vous pourriez être intéressé par Vecteur de données (tranche) .

ghci> import Data.Vector
ghci> let v = fromList [1..10]
ghci> v
fromList [1,2,3,4,5,6,7,8,9,10]
ghci> slice 4 5 v
fromList [5,6,7,8,9]

Notez que slice en Data.Vector prend comme entrées les indice de départ et le longueur de la tranche .

5voto

Nomics Points 436
> drop 4 (take 9 [1,2,3,4,5,6,7,8,9,0])

[5,6,7,8,9]

1voto

Landei Points 30509

Hmmm, pas très pratique, mais on peut peut-être l'améliorer ?

(\(x,y) -> if 4 <= y && y <= 9 then [x] else []) =<< zip [1,2,3,4,5,6,7,8,9] [0..]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X