{"id":995,"date":"2010-12-16T20:47:37","date_gmt":"2010-12-16T20:47:37","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2010-ejercicios-de-definiciones-por-plegado-2\/"},"modified":"2013-03-08T05:50:05","modified_gmt":"2013-03-08T05:50:05","slug":"i1m2010-ejercicios-de-definiciones-por-plegado-2","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2010-ejercicios-de-definiciones-por-plegado-2\/","title":{"rendered":"I1M2010: Ejercicios de definiciones por plegado (2)"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-10\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado la resoluci\u00f3n de ejercicios por plegado, resaltando el paso de las definiciones por recursi\u00f3n a las correspondientes definiciones por plegados. Los ejercicios comentados son el 13 de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2010\/index.php5\/Relaci%C3%B3n_11\">11\u00aa relaci\u00f3n<\/a> y los cuatro primeros de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2010\/index.php5\/Relaci%C3%B3n_12\">12\u00aa relaci\u00f3n<\/a>.<\/p>\n<p>Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. Redefinir, usando foldr, la funci\u00f3n filter. Por\r\n-- ejemplo, \r\n--    filter' (<4) [1,7,3,2]  =>  [1,3,2]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n por recursi\u00f3n es\r\nfilterR :: (a -> Bool) -> [a] -> [a]\r\nfilterR p [] = []\r\nfilterR p (x:xs) | p x       = x : filterR p xs\r\n                 | otherwise = filterR p xs\r\n\r\n-- La definici\u00f3n por plegado es\r\nfilter' :: (a -> Bool) -> [a] -> [a]\r\nfilter' p = foldr g []\r\n            where g x y | p x       = x:y \r\n                        | otherwise = y\r\n\r\n-- La definici\u00f3n por plegado y lambda es\r\nfilter' :: (a -> Bool) -> [a] -> [a]\r\nfilter' p = foldr (\\x y -> if (p x) then (x:y) else y) []\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Redefinir, mediante plegado, la funci\u00f3n maximum.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n por recursi\u00f3n es\r\nmaximumR :: Ord a => [a] -> a\r\nmaximumR [x]      = x\r\nmaximumR (x:y:ys) = max y (maximumR (x:ys))\r\n\r\n-- La definici\u00f3n por plegado con foldr es\r\nmaximum' :: Ord a => [a] -> a\r\nmaximum' (x:xs) = (foldr max x) xs\r\n\r\n-- La definici\u00f3n de foldr1 es\r\n--    foldr1 :: (a -> a -> a) -> [a] -> a\r\n--    foldr1 _ [x]    =  x\r\n--    foldr1 f (x:xs) =  f x (foldr1 f xs)\r\n\r\n-- Otra definici\u00f3n por recursi\u00f3n es\r\nmaximumR' :: Ord a => [a] -> a\r\nmaximumR' [x]      = x\r\nmaximumR' (x:y:ys) = max x (maximumR' (y:ys))\r\n\r\n-- Otra definici\u00f3n, usando foldr1, es\r\nmaximum'' :: Ord a => [a] -> a\r\nmaximum'' = foldr1 max\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Redefinir por plegado la funci\u00f3n minimum.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Por analog\u00eda con el anterior.\r\n\r\n-- Definici\u00f3n con foldr:\r\nminimum' :: Ord a => [a] -> a\r\nminimum' (x:xs) = (foldr min x) xs\r\n\r\n-- Otra definici\u00f3n, usando foldr1, es\r\nminimum'' :: Ord a => [a] -> a\r\nminimum'' = foldr1 min\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir, usando foldr, la funci\u00f3n\r\n--    inversaFR :: [a] -> [a]\r\n-- tal que (inversaFR xs) es la inversa de la lista xs. Por ejemplo,\r\n--    inversaFR [3,5,2,4,7]  =>  [7,4,2,5,3]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n por recursi\u00f3n es\r\ninversaR :: [a] -> [a]\r\ninversaR [] = []\r\ninversaR (x:xs) = (inversaR xs) ++ [x]\r\n\r\n-- La definici\u00f3n con foldR es\r\ninversaFR :: [a] -> [a]\r\ninversaFR = foldr f []\r\n    where f x y = y ++ [x]\r\n\r\n-- La definici\u00f3n anterior puede simplificarse a\r\ninversaFR' :: [a] -> [a]\r\ninversaFR' = foldr f []\r\n    where f x = (++ [x])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir, usando foldl, la funci\u00f3n\r\n--    inversaFL :: [a] -> [a]\r\n-- tal que (inversaFL xs) es la inversa de la lista xs. Por ejemplo,\r\n--    inversaFL [3,5,2,4,7]  ==  [7,4,2,5,3]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n por recursi\u00f3n con acumulador es\r\ninversaR' :: [a] -> [a]\r\ninversaR' xs = inversaAux [] xs\r\n    where inversaAux a []     = a\r\n          inversaAux a (x:xs) = inversaAux (x:a) xs\r\n\r\n-- La definici\u00f3n de foldl es\r\n--    foldl :: (a -> b -> a) -> a -> [b] -> a\r\n--    foldl f z0 xs0 = aux z0 xs0\r\n--        where aux z []     = z\r\n--              aux z (x:xs) = aux (f z x) xs\r\n\r\n-- La definci\u00f3n de inversaFL es\r\ninversaFL :: [a] -> [a]\r\ninversaFL = foldl (\\a x -> x:a) []\r\n\r\n-- La definci\u00f3n de inversaFL puede simplificarse usando flip:\r\ninversaFL' :: [a] -> [a]\r\ninversaFL' = foldl (flip(:)) []\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado la resoluci\u00f3n de ejercicios por plegado, resaltando el paso de las definiciones por recursi\u00f3n a las correspondientes definiciones por plegados. Los ejercicios comentados son el 13 de la 11\u00aa relaci\u00f3n y los cuatro primeros de la 12\u00aa relaci\u00f3n. Los ejercicios&#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":[133],"tags":[270,287,161],"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\/995"}],"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=995"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/995\/revisions"}],"predecessor-version":[{"id":2962,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/995\/revisions\/2962"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=995"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=995"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=995"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}