2010-05-05 8 views
1

Je veux définir une expérience identique à la fonction de répliquer une liste de numéros de sa valeur en utilisant uniquement la compréhension de la liste, par exemple:Comment résoudre ce problème Haskell?

replicate [5,1,3,2,8,1,2] 
output: [5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2] 

Je sais que ce serait facile d'utiliser le « reproduire » construit en fonction mais seulement liste de compréhension est permettre, comment puis-je faire cela?

MERCI!

+0

merci pour les conseils, j'allais ajouter maintenant, mais MtnViewMark me devança. –

Répondre

9

Neat petit problème. Je l'ai résolu comme ça.

replicate list = [ a | a <- list, _ <- [1..a]] 

Prelude> répliquer [5,1,3,2,8,1,2]

[5,5,5,5,5,1,3,3,3,2, 2,88,8,8,8,8,8,8,1,2,2]

Il prend chaque valeur dans la liste, crée autant de copies de lui-même, puis passe à la suivante valeur.

+0

cela fonctionne, mais je ne sais pas comment. il semble que 'b' n'a rien à voir avec 'a' mais il le fait avoir plusieurs copies. intéressant sur comment cela fonctionne. –

+2

Astuce: Vous pouvez lire des compréhensions de liste simples comme des boucles impératives qui accumulent des valeurs à la fin d'une liste. 'a <- list' dit" boucle sur chaque élément de 'list'" et 'b <- [1..a]' est une boucle à l'intérieur de cette boucle disant "boucle avec' b' allant de 1 à 'a'" . Le 'a' au début dit accumuler' a' sur la fin de la liste à chaque fois. – sigfpe

+2

Je suggère d'utiliser _ au lieu de b pour indiquer clairement que vous ne vous souciez pas vraiment de la valeur de b. – sepp2k

7

Pour kicks:

import Control.Monad 
import Control.Monad.Instances 

repList = concatMap $ join replicate 
Questions connexes