import Data.Matrix (Matrix, fromLists)
import Data.List (lookup)
ampliada :: Num a => Int -> [[(Int,a)]] -> Matrix a
ampliada n xss =
fromLists [filaAmpliada n xs | xs <- xss]
-- Se puede redefinir con un argumento
ampliada2 :: Num a => Int -> [[(Int,a)]] -> Matrix a
ampliada2 n = fromLists . map (filaAmpliada n)
-- Se puede redefinir sin argumentos usando las siguientes reducciones
-- fromLists . map (filaAmpliada n)
-- = fromLists . ((map . filaAmpliada) n)
-- = ((fromLists .) . (map . filaAmpliada)) n
-- = ((fromLists .) . map . filaAmpliada) n
ampliada3 :: Num a => Int -> [[(Int,a)]] -> Matrix a
ampliada3 = (fromLists .) . map . filaAmpliada
-- (filaAmpliada n xs) es la fila ampliada de la representación reducida
-- xs de una matriz con n columnas. Por ejemplo,
-- filaAmpliada 3 [(2,5)] == [0,5,0]
-- filaAmpliada 7 [(2,5),(1,3)] == [3,5,0,0,0,0,0]
filaAmpliada :: Num a => Int -> [(Int,a)] -> [a]
filaAmpliada n xs =
[f (lookup i xs) | i <- [1..n]]
where f Nothing = 0
f (Just x) = x