2010-11-15 9 views
2

que nous avons une liste de coordonnées telles que:
(1,2)
(0,3)
(4,1)
(0,3)
(-2,3)
(6,5)Mappage d'une liste à une autre (dans Haskell, + solution abstraite) - 'map reduce'?

Et nous voulions aboutir à la liste suivante, qui est définie comme la sommation de chaque coordonnées consécutives. (Définition Désolé mauvais) comme ceci:
(1,5)
(4,4)
(4,4)
(-2,6)
(4,8)

Il y a existe un ensemble A = (a, b, c, ..., n) où a, b, c, ..., n sont les coordonnées dans R^2.
Il existe une fonction f telle que f (A) = B = (a + b, b + c, c + d, ..., n-1 + n).

~

Comment voulez-vous écrire quelque chose comme ça dans un langage fonctionnel comme Haskell? Un programme qui applique f à un A donné pour donner 0.

+0

est-ce devoirs? – Drakosha

Répondre

6

Vous pouvez utiliser zip pour compresser la liste avec sa queue, vous obtenez des paires de paires comme [((1,2), (0,3)), ((0,3),(4,1)), ...]. Ensuite, vous pouvez utiliser map pour remplacer chaque paire de paires par sa somme. Ou vous pouvez utiliser zipWith qui est essentiellement zip + map dans une fonction, à l'exception de la fonction donnée à zipWith est de type a -> b -> c, non (a,b) -> c:

summedCoords = zipWith (\ (a,b) (c,d) -> (a+c, b+d)) coords (tail coords) 
+1

Je pense que vous vouliez dire 'coords summedCoords = zipWith (\ (a, b) (c, d) -> (a + c, b + d)) coords (queue coords)'? :) – ShinNoNoir

+1

@Shin: Oui, je l'ai fait absolument. Merci. – sepp2k

1

Vous pouvez écrire une fonction générique comme celui-ci

g:: (a -> a -> b) -> [a] -> [b] 
g f (x1:x2:xs) = (f x1 x2):(g (x2:xs)) 
g _ (x1:[]) = [] 

et passez-le votre fonction d'ajout

f = g f' where 
    f' (a,b) (a',b') = (a+a', b+b')