Suma de una lista de vectores
Definir la función
1 |
sumaVec :: Num a => [[a]] -> [a] |
tal que (sumaVec xss) es la suma de los vectores de xss. Por ejemplo,
1 2 |
sumaVec [[4,7,3],[3,1,4],[2,2,5]] == [9,10,12] sumaVec [[4,7],[3,3],[1,4],[2,5]] == [10,19] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import Data.List (transpose) import Data.Array (listArray,(!)) -- 1ª definición (por recursión): sumaVec1 :: Num a => [[a]] -> [a] sumaVec1 [] = [] sumaVec1 [xs] = xs sumaVec1 (xs:ys:zss) = suma xs (sumaVec1 (ys:zss)) -- (suma xs ys) es la suma de los vectores xs e ys. Por ejemplo, -- suma [4,7,3] [1,2,5] == [5,9,8] suma :: Num a => [a] -> [a] -> [a] suma [] [] = [] suma (x:xs) (y:ys) = x+y : suma xs ys -- 2ª definición (por recursión con zipWith): sumaVec2 :: Num a => [[a]] -> [a] sumaVec2 [] = [] sumaVec2 [xs] = xs sumaVec2 (xs:xss) = zipWith (+) xs (sumaVec2 xss) -- 3ª definición (por plegado) sumaVec3 :: Num a => [[a]] -> [a] sumaVec3 = foldr1 (zipWith (+)) -- 4ª definición (con map y transpose): sumaVec4 :: Num a => [[a]] -> [a] sumaVec4 = map sum . transpose -- 5ª definición (con array) -- ========================= sumaVec5 :: Num a => [[a]] -> [a] sumaVec5 xss = [sum [p!(i,j) | i <- [1..m]] | j <- [1..n]] where m = length xss n = length (head xss) p = listArray ((1,1),(m,n)) (concat xss) |
Elegante, tambien se podria escribir en point free como