2016-09-23 6 views
0

J'ai une grande liste de listes. Et je veux concat chaque troisième liste dans l'autre. Comme telConcaténer chaque troisième liste

let xss = [[1,2,3],[1,2,3],[1,2,3], 
      [4,5,6],[4,5,6],[4,5,6], 
      [7,8,9],[7,8,9],[7,8,9]] 

someFunk xss = [[1,2,3,1,2,3,1,2,3], 
       [4,5,6,4,5,6,4,5,6], 
       [7,8,9,7,8,9,7,8,9]] 

Y at-il une façon de le faire?

+1

Bien sûr il y a. Avez-vous essayé quelque chose? –

+1

@ shree.pat18 ouais. 'catThird (xs: xss) = xs ++ prend 9 (catThird xss)' Mais cela ne fonctionne que sur les 3 premières listes –

Répondre

3

Vous pouvez essayer quelque chose comme ceci:

someFunk :: [[a]] -> [[a]] 
someFunk (x:y:z:zs) = (x ++ y ++ z) : someFunk zs 
someFunk (x:y:ys) = (x ++ y) : someFunk ys 
someFunk (x:xs) = x : someFunk xs 
someFunk _ = [] 

en utilisant la correspondance de motif, vous vérifiez pour obtenir une liste d'au moins trois listes, joignez-les et appelez récursive sur le reste de la liste. Si le nombre de listes n'est pas un multiple exact de 3, les modèles suivants vous permettent encore de concaténer les 3 suivants tant que vous en disposez.

Demo

+0

Nice. Je ne savais pas que vous pouviez trouver un motif comme ceci '(x: y: z: zs)' mais maintenant, quand je le vois, c'est logique! –

11

Juste à des fins de bikeshedding, je pense que je voudrais écrire quelque chose comme ceci:

import Data.List.Split 
someFunk = map concat . chunksOf 3 

Il est concis, et je pense qu'il lit aussi beaucoup comme votre description en anglais. Il utilise le package split.