{"id":5618,"date":"2016-11-18T20:19:05","date_gmt":"2016-11-18T19:19:05","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5618"},"modified":"2016-11-21T06:19:58","modified_gmt":"2016-11-21T05:19:58","slug":"i1m2016-ejercicios-de-funciones-de-orden-superior","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2016-ejercicios-de-funciones-de-orden-superior\/","title":{"rendered":"I1M2016: Ejercicios de funciones de orden superior"},"content":{"rendered":"<p>En la primera parte de la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-15\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones de los primeros ejercicios de la relaci\u00f3n 8 sobre Funciones de orden superior.<\/p>\n<p>Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- Introducci\u00f3n                                                       --\n-- ---------------------------------------------------------------------\n\n-- Esta relaci\u00f3n tiene contiene ejercicios con funciones de orden\n-- superior y definiciones por plegado correspondientes al tema 7 \n-- http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-16\/temas\/tema-7.html\n\n-- ---------------------------------------------------------------------\n-- Importaci\u00f3n de librer\u00edas auxiliares                                --\n-- ---------------------------------------------------------------------\n\nimport Test.QuickCheck\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n\n--    segmentos :: (a -> Bool) -> [a] -> [a]\n-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos\n-- elementos verifican la propiedad p. Por ejemplo,\n--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]\n--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]\n-- ---------------------------------------------------------------------\n\nsegmentos :: (a -> Bool) -> [a] -> [[a]]\nsegmentos _ [] = []\nsegmentos p (x:xs) \n    | p x       = takeWhile p (x:xs) : segmentos p (dropWhile p xs)\n    | otherwise = segmentos p xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.1. Definir, por comprensi\u00f3n, la funci\u00f3n\n--    relacionadosC :: (a -> a -> Bool) -> [a] -> Bool\n-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de\n-- elementos consecutivos de xs se cumple la relaci\u00f3n r. Por ejemplo,\n--    relacionadosC (<) [2,3,7,9]                ==  True\n--    relacionadosC (<) [2,3,1,9]                ==  False\n-- ---------------------------------------------------------------------\n\nrelacionadosC :: (a -> a -> Bool) -> [a] -> Bool\nrelacionadosC r xs = and [r x y | (x,y) <- zip xs (tail xs)]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2.2. Definir, por recursi\u00f3n, la funci\u00f3n\n--    relacionadosR :: (a -> a -> Bool) -> [a] -> Bool\n-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de\n-- elementos consecutivos de xs se cumple la relaci\u00f3n r. Por ejemplo,\n--    relacionadosR (<) [2,3,7,9]                ==  True\n--    relacionadosR (<) [2,3,1,9]                ==  False\n-- ---------------------------------------------------------------------\n\nrelacionadosR :: (a -> a -> Bool) -> [a] -> Bool\nrelacionadosR r (x:y:zs) = (r x y) && relacionadosR r (y:zs)\nrelacionadosR _ _        = True\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3.1. Definir la funci\u00f3n\n--    agrupa :: Eq a => [[a]] -> [[a]]\n-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando\n-- los primeros elementos, los segundos, ... Por ejemplo, \n--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]\n--    agrupa []                        ==  []\n-- ---------------------------------------------------------------------\n\nagrupa :: Eq a => [[a]] -> [[a]]\nagrupa []  = []\nagrupa xss\n    | [] `elem` xss = []\n    | otherwise     = primeros xss : agrupa (restos xss)\n    where primeros = map head\n          restos   = map tail\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los\n-- elementos de (agrupa xs) es igual a la longitud de xs.\n-- ---------------------------------------------------------------------\n\n-- La propiedad es\nprop_agrupa :: [[Int]] -> Bool\nprop_agrupa xss =\n    and [length xs == n | xs <- agrupa xss]\n    where n = length xss\n\n-- La comprobaci\u00f3n es\n--    ghci> quickCheck prop_agrupa\n--    +++ OK, passed 100 tests.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la primera parte de la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado las soluciones de los primeros ejercicios de la relaci\u00f3n 8 sobre Funciones de orden superior. Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<\/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":[260],"tags":[270,313],"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\/5618"}],"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=5618"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5618\/revisions"}],"predecessor-version":[{"id":5619,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5618\/revisions\/5619"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}