2010-12-02 13 views
1

I have 2 listes:Itère le long 2 listes en même temps dans haskell (sans avoir recours à zip)

[[1,2],[4,5]] 

et

[0, 3] 

et je voudrais en faire

[[0,1,2],[3,4,5]] 

J'ai créé une fonction qui fait cela:

myFun xxs xs = map (\x -> (fst x):(snd x)) (zip xs xxs) 

et cela fonctionne. Mais je suis toujours en train de me demander s'il existe un meilleur moyen d'y parvenir sans utiliser le zip. Y a-t-il?

Fondamentalement ce que je veux faire est de parcourir les deux listes en même temps, quelque chose que je ne peux pas penser à un moyen de faire dans Haskell sans recourir à zip.

Merci

+2

'zipWith f xs ys = carte (uncurry f) $ zip xs ys' – ephemient

Répondre

7

Utilisez zipWith. Par exemple:

zipWith (:) [0,3] [[1,2],[4,5]] 

donne:

[[0,1,2],[3,4,5]] 
+0

Ahh! Formidable! –

5

Pourquoi le zip n'est-il pas une option?

Ou devrais-je dire, zipWith.

zipWith (\x y -> x:y) xs xxs 
+0

Ce n'est pas que ce n'est pas une option. Je me demande simplement s'il existe d'autres moyens de le faire. –

+0

Ahhhhhhhh. Ce zipwith pourrait bien être ce que je cherchais! –

+0

'zipWith' est le moyen prévu pour joindre les éléments de deux listes en utilisant une fonction arbitraire. Toute autre méthode consiste essentiellement à réimplémenter 'zipWith'. –

4

Vous pouvez déplacer le zip dans le type avec ZipList de Control.Applicative:

myFun xxs xs = getZipList $ (:) <$> ZipList xs <*> ZipList xxs