Definir la función
sumaVec :: Num a => [[a]] -> [a] |
sumaVec :: Num a => [[a]] -> [a]
tal que (sumaVec xss) es la suma de los vectores de xss. Por ejemplo,
sumaVec [[4,7,3],[3,1,4],[2,2,5]] == [9,10,12]
sumaVec [[4,7],[3,3],[1,4],[2,5]] == [10,19] |
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
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) |
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)
Se puede imprimir o compartir con
Elegante, tambien se podria escribir en point free como