2011-01-23 19 views
10

Supongamos que quiero agregar dos listas en Haskell. ¿Cuál es la forma más usual de hacer esto?¿Cuál es una forma idiomática de agregar listas en Haskell?

Aquí es lo que hice:

addLists :: (Integral a) => [a] -> [a] -> [a] 
addLists xs ys = map add $ zip xs ys 
    where add (x, y) = x+y 
+3

BTW: 'add = uncurry (+)'. También tenga en cuenta que la respuesta 'zipWith' es el primer hit en [Hoogle] (http://haskell.org/hoogle/) para la consulta [' (a -> b -> c) -> \ [a \] - > \ [b \] -> \ [c \] '] (http://haskell.org/hoogle/?hoogle=%28a+-%3E+b+-%3E+c%29+-%3E+%5Ba% 5D + -% 3E +% 5Bb% 5d + -% 3E +% 5Bc% 5D). – ephemient

+0

Gracias efusivo, probaré con Hoogle la próxima vez. –

+0

@TomMD, no entiendo la primera parte de su comentario. –

Respuesta

28

hay una función zipWith biblioteca que combina dos listas mediante el uso de una función que se suministra. Hace exactamente lo que usted quiere aquí y se obtiene:

addLists = zipWith (+) 

Este utiliza (+) de combinar los elementos de las listas dados como argumentos adicionales.

+0

Aw me ganó. –

2
addLists xs ys = zipWith (+) xs ys 
6

estilo aplicativo Functor:

import Control.Applicative 

addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys 

Tenga en cuenta que esto es tan feo, porque hay dos maneras de hacer una lista de Aplicativo Functor. La primera (y en mi humilde opinión menos útil) es tomar todas las combinaciones, y de esa manera se convirtió en el "estándar", por lo que (+) <$> [1,2] <*> [30,40] es [31,41,32,42]. La otra forma es comprimir las listas como necesitamos aquí, pero como solo puede tener una instancia de clase de tipo por tipo, debemos envolver las listas en ZipLists y desenvolver el resultado usando getZipList.

Cuestiones relacionadas