{"id":2488,"date":"2013-01-21T18:43:32","date_gmt":"2013-01-21T18:43:32","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=2488"},"modified":"2013-03-08T05:47:35","modified_gmt":"2013-03-08T05:47:35","slug":"i1m2012-funciones-de-orden-superior-2","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-funciones-de-orden-superior-2\/","title":{"rendered":"I1M2012: Funciones de orden superior (2)"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-12\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos continuado comentando las soluciones de los ejercicios de la  <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2012G2\/images\/e\/e4\/Rel_14.hs\">14\u00aa relaci\u00f3n<\/a> (de funciones de orden superior). <\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n:<br \/>\n<!--more--> <\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas auxiliares                                --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Test.QuickCheck\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.1. La funci\u00f3n \r\n--    divideMedia :: [Double] -> ([Double],[Double])\r\n-- dada una lista num\u00e9rica, xs, calcula el par (ys,zs), donde ys \r\n-- contiene los elementos de xs estrictamente menores que la media, \r\n-- mientras que zs contiene los elementos de xs estrictamente mayores \r\n-- que la media. Por ejemplo, \r\n--    divideMedia [6,7,2,8,6,3,4] ==  ([2.0,3.0,4.0],[6.0,7.0,8.0,6.0])\r\n--    divideMedia [1,2,3]         ==  ([1.0],[3.0])\r\n-- Definir la funci\u00f3n divideMedia por filtrado, comprensi\u00f3n y\r\n-- recursi\u00f3n. \r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n por filtrado es\r\ndivideMediaF :: [Double] -> ([Double],[Double])\r\ndivideMediaF xs = (filter (<m) xs, filter (>m) xs)\r\n    where m = media xs\r\n\r\n-- (media xs) es la media de xs. Por ejemplo,\r\n--    media [1,2,3]       ==  2.0\r\n--    media [1,-2,3.5,4]  ==  1.625 \r\n-- Nota: En la definici\u00f3n de media se usa la funci\u00f3n fromIntegral tal\r\n-- que (fromIntegral x) es el n\u00famero real correspondiente al n\u00famero\r\n-- entero x. \r\nmedia :: [Double] -> Double\r\nmedia xs = (sum xs) \/ fromIntegral (length xs)\r\n\r\n-- La definici\u00f3n por comprensi\u00f3n es\r\ndivideMediaC :: [Double] -> ([Double],[Double])\r\ndivideMediaC xs = ([x | x <- xs, x < m], [x | x <- xs, x > m])\r\n    where m = media xs\r\n\r\n-- La definici\u00f3n por recursi\u00f3n es\r\ndivideMediaR :: [Double] -> ([Double],[Double])\r\ndivideMediaR xs = divideMediaR' xs\r\n    where m = media xs\r\n          divideMediaR' [] = ([],[])\r\n          divideMediaR' (x:xs) | x < m  = (x:ys, zs)\r\n                               | x == m = (ys, zs)\r\n                               | x > m  = (ys, x:zs)\r\n                               where (ys, zs) = divideMediaR' xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.2. Comprobar con QuickCheck que las tres definiciones\r\n-- anteriores divideMediaF, divideMediaC y divideMediaR son\r\n-- equivalentes.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_divideMedia :: [Double] -> Bool\r\nprop_divideMedia xs =\r\n    divideMediaC xs == d &&\r\n    divideMediaR xs == d\r\n    where d = divideMediaF xs \r\n    \r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_divideMedia\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.3. Comprobar con QuickCheck que si (ys,zs) es el par\r\n-- obtenido aplic\u00e1ndole la funci\u00f3n divideMediaF a xs, entonces la suma\r\n-- de las longitudes de ys y zs es menor o igual que la longitud de xs.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_longitudDivideMedia :: [Double] -> Bool\r\nprop_longitudDivideMedia xs =\r\n    length ys + length zs <= length xs\r\n    where (ys,zs) = divideMediaF xs\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_longitudDivideMedia\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.4. Comprobar con QuickCheck que si (ys,zs) es el par\r\n-- obtenido aplic\u00e1ndole la funci\u00f3n divideMediaF a xs, entonces todos los\r\n-- elementos de ys son menores que todos los elementos de zs.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_divideMediaMenores :: [Double] -> Bool\r\nprop_divideMediaMenores xs =\r\n    and [y < z | y <- ys, z <- zs]\r\n    where (ys,zs) = divideMediaF xs\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_divideMediaMenores\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.5. Comprobar con QuickCheck que si (ys,zs) es el par\r\n-- obtenido aplic\u00e1ndole la funci\u00f3n divideMediaF a xs, entonces la\r\n-- media de xs no pertenece a ys ni a zs.\r\n-- Nota: Usar la funci\u00f3n notElem tal que (notElem x ys) se verifica si y\r\n-- no pertenece a ys.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_divideMediaSinMedia :: [Double] -> Bool\r\nprop_divideMediaSinMedia xs =\r\n    notElem m (ys ++ zs)\r\n    where  m       = media xs\r\n           (ys,zs) = divideMediaF xs\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_divideMediaSinMedia\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    segmentos :: (a -> Bool) -> [a] -> [a]\r\n-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos\r\n-- elementos verifican la propiedad p. Por ejemplo,\r\n--    segmentos even [1,2,0,4,5,6,48,7,2]  ==  [[],[2,0,4],[6,48],[2]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsegmentos :: (a -> Bool) -> [a] -> [[a]]\r\nsegmentos _ [] = []\r\nsegmentos p xs = \r\n    takeWhile p xs : (segmentos p (dropWhile (not.p) (dropWhile p xs)))\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 continuado comentando las soluciones de los ejercicios de la 14\u00aa relaci\u00f3n (de funciones de orden superior). Los ejercicios, y sus soluciones, 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":[1],"tags":[298],"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\/2488"}],"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=2488"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2488\/revisions"}],"predecessor-version":[{"id":2701,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2488\/revisions\/2701"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=2488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=2488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=2488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}