{"id":6484,"date":"2019-02-13T12:46:31","date_gmt":"2019-02-13T11:46:31","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=6484"},"modified":"2019-02-13T12:46:31","modified_gmt":"2019-02-13T11:46:31","slug":"i1m2018-matrices-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2018-matrices-en-haskell\/","title":{"rendered":"I1M2018: Matrices en Haskell"},"content":{"rendered":"<p>En la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-18\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se ha estudiado c\u00f3mo trabajar con tablas en Haskell usando el m\u00f3dulo Data.Array.<\/p>\n<p>En la primera parte se ha explicado <a href=\"https:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-18\/temas\/tema-18.html#el-tipo-predefinido-de-las-tablas-arrays\">El tipo predefinido de las tablas (&#8220;arrays&#8221;)<\/a> se han estudiado las funciones sobre \u00edndices (range, index, inRange, rangeSize) y sobre tablas (array, (!), bounds, indices, elems, assocs, (\/\/), listArray y accumArray). Tambi\u00e9n se han estudiado ejemplos de definiciones con dichas funciones.<\/p>\n<p>Los apuntes correspondientes son<br \/>\n\n<!-- iframe plugin v.5.0 wordpress.org\/plugins\/iframe\/ -->\n<iframe loading=\"lazy\" src=\"https:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-18\/temas\/tema-18.html#el-tipo-predefinido-de-las-tablas-arrays\" width=\"100%\" frameborder=\"1\" height=\"500\" scrolling=\"yes\" class=\"iframe-class\"><\/iframe>\n<\/p>\n<p>En la segunda parte se han comentado las soluciones de los siguientes ejercicios de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2018G4\/images\/b\/b9\/Rel_15.hs\">Relaci\u00f3n 15<\/a>:<\/p>\n<p><!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- Importaci\u00f3n de librer\u00edas                                           --\n-- ---------------------------------------------------------------------\n\nimport Data.Array\n\n-- ---------------------------------------------------------------------\n-- Tipos de los vectores y de las matrices                            --\n-- ---------------------------------------------------------------------\n\n-- Los vectores son tablas cuyos \u00edndices son n\u00fameros naturales.\ntype Vector a = Array Int a\n \n-- Las matrices son tablas cuyos \u00edndices son pares de n\u00fameros\n-- naturales. \ntype Matriz a = Array (Int,Int) a\n\n-- ---------------------------------------------------------------------\n-- Operaciones b\u00e1sicas con matrices                                   --\n-- ---------------------------------------------------------------------\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n\n--    listaVector :: Num a => [a] -> Vector a\n-- tal que (listaVector xs) es el vector correspondiente a la lista\n-- xs. Por ejemplo, \n--    ghci> listaVector [3,2,5]\n--    array (1,3) [(1,3),(2,2),(3,5)]\n-- ---------------------------------------------------------------------\n\nlistaVector :: Num a => [a] -> Vector a\nlistaVector xs = listArray (1,n) xs\n    where n = length xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. Definir la funci\u00f3n\n--    listaMatriz :: Num a => [[a]] -> Matriz a\n-- tal que (listaMatriz xss) es la matriz cuyas filas son los elementos\n-- de xss. Por ejemplo,\n--    ghci> listaMatriz [[1,3,5],[2,4,7]]\n--    array ((1,1),(2,3)) [((1,1),1),((1,2),3),((1,3),5),\n--                         ((2,1),2),((2,2),4),((2,3),7)]\n-- ---------------------------------------------------------------------\n\nlistaMatriz :: Num a => [[a]] -> Matriz a\nlistaMatriz xss = listArray ((1,1),(m,n)) (concat xss)\n    where m = length xss\n          n = length (head xss)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3. Definir la funci\u00f3n\n--    numFilas :: Num a => Matriz a -> Int\n-- tal que (numFilas m) es el n\u00famero de filas de la matriz m. Por\n-- ejemplo,\n--    numFilas (listaMatriz [[1,3,5],[2,4,7]])  ==  2\n-- ---------------------------------------------------------------------\n\nnumFilas :: Num a => Matriz a -> Int\nnumFilas = fst . snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Definir la funci\u00f3n\n--    numColumnas :: Num a => Matriz a -> Int\n-- tal que (numColumnas m) es el n\u00famero de columnas de la matriz\n-- m. Por ejemplo,\n--    numColumnas (listaMatriz [[1,3,5],[2,4,7]])  ==  3\n-- ---------------------------------------------------------------------\n\nnumColumnas:: Num a => Matriz a -> Int\nnumColumnas = snd . snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 5. Definir la funci\u00f3n\n--    dimension :: Num a => Matriz a -> (Int,Int)\n-- tal que (dimension m) es la dimensi\u00f3n de la matriz m. Por ejemplo, \n--    dimension (listaMatriz [[1,3,5],[2,4,7]])  ==  (2,3)\n-- ---------------------------------------------------------------------\n\ndimension :: Num a => Matriz a -> (Int,Int)\ndimension = snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9. Definir la funci\u00f3n\n--    sumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a\n-- tal que (sumaMatrices x y) es la suma de las matrices x e y. Por\n-- ejemplo, \n--    ghci> let m1 = listaMatriz [[5,1,0],[3,2,6]]\n--    ghci> let m2 = listaMatriz [[4,6,3],[1,5,2]]\n--    ghci> matrizLista (sumaMatrices m1 m2)\n--    [[9,7,3],[4,7,8]]\n-- ---------------------------------------------------------------------\n\nsumaMatrices :: Num a => Matriz a -> Matriz a -> Matriz a\nsumaMatrices p q = \n    array ((1,1),(m,n)) [((i,j),p!(i,j)+q!(i,j))  \n                        | i <- [1..m], j <- [1..n]]\n    where (m,n) = dimension p\n<\/pre>\n<p>Finalmente, se ha comentado la soluci\u00f3n del problema <a href=\"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/medias-de-digitos-de-pi\/\">Medias de d\u00edgitos de pi<\/a> de Exercitium.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se ha estudiado c\u00f3mo trabajar con tablas en Haskell usando el m\u00f3dulo Data.Array. En la primera parte se ha explicado El tipo predefinido de las tablas (&#8220;arrays&#8221;) se han estudiado las funciones sobre \u00edndices (range, index, inRange, rangeSize) y sobre&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[320],"tags":[270,321],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6484"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=6484"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6484\/revisions"}],"predecessor-version":[{"id":6485,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/6484\/revisions\/6485"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=6484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=6484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=6484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}