Você está na página 1de 6

Universidad CAECE Paradigmas de Lenguajes de Programacin

PRCTICA 3 Funciones de orden superior


1. Definir una funcin esCerrada, que dada una lista y una funcin binaria (que toma un par de elementos del tipo de la lista y devuelve un elemento del tipo de la lista) devuelve si la funcin es cerrada respecto a la lista de entrada (o sea, si la imagen de la funcin --tomando como dominio la lista-- est includa en esta lista dominio!).

". i) Definir una funcin maxf, que dada una funcin con dominio e imagen en un tipo num#rico ordenado y una lista (de tipo dominio de la funcin dada), devuelve el valor m$imo de la imagen alcan%ada por los elementos de la lista. ii) Definir minf (dem anterior, pero devolviendo el mnimo) usando ma$f y la negacin unaria (negate). &. i) Definir una funcin supf, que dadas dos funciones del mismo dominio e imagen, devuelva la funcin m$imo puntual (para todo elemento del dominio devuelve el m$imo de las aplicaciones de las dos funciones). ii) Definir inff (dem anterior, pero devolviendo el mnimo) usando supf. '. i) Definir una funcin genLista que genere una lista de una cantidad dada de elementos a partir de un elemento inicial dado y de una funcin dada que represente la funcin de incremento! entre los elementos de la lista (que dado un elemento que pertene%ca a la lista devuelva el elemento siguiente en la misma lista, si es que e$iste por la longitud). ii) Definir usando gen(ista. ). Definir una funcin filter que depura una lista, de*ando slo aquellos elementos que cumplen con una condicin dada. +sta condicin est refle*ada en una funcin booleana. +*, filter even -1,",&,',). -",'.. +n /as0ell esta funcin no se aplica sobre listas, sino sobre elementos de un tipo perteneciente a la clase 1onad2ero, que incluye a las listas.

3. i) Definir la funcin infi*a o de composicin de funciones. +n /as0ell esta funcin est predefinida y se llama (.). 45u# restricciones 6abr que 6acerle respecto a la composicin matemtica7 ii) Definir ultimo y segundo (devuelve el segundo elemento de una lista) usando la funcin o. 8. i) Definir la funcin curry, que dada una funcin de dos argumentos, devuelve su equivalente currificada. 45u# limitaciones debe tener esta funcin7 ii) Definir la funcin uncurry, que dada una funcin currificada de dos argumentos, devuelva su versin no currificada equivalente. iii) 45u# diferencia fundamental e$iste entre una funcin currificada y su equivalente no currificada7 1ostrar algunos e*emplos en que la currificacin resulte beneficiosa. 4+$iste una manera 9nica de currificar una funcin7 iv) Discuta la posibilidad de definir una funcin curryN, que tome una funcin de un n9mero arbitrario de argumentos (aunque siempre en formato de producto cartesiano de dos tipos) y devuelva su versin currificada.
Pgina 1

Universidad CAECE Paradigmas de Lenguajes de Programacin

:. i) Definir las versiones currificadas y no currificadas suma de dos enteros y division entera de dos enteros. ii) Definir --usando funciones currificadas anteriores-- a las funciones sucesor de un entero, predecesor de un entero, mitad de un entero y dos eces la aplicacin de una funcin. iii) Definir cuatro eces usando dos;eces. <. i) =rogramar la funcin no currificada separar, que dada una condicin y una lista devuelva un par de listas donde la primera est# conformada por aquellos elementos de la lista original que cumplan con la condicin, y la segunda, por aquellos que no la cumplen. ii) =rogramar una versin currificada de separar usando filter. iii) Dada una funcin mayoria que recibe un n9mero y una lista de listas de n9meros, y devuelve otra lista de listas de n9meros, donde cada lista-elemento es aqu#l de la lista de entrada donde la cantidad de elementos mayores al n9mero dado es mayor a la cantidad de elementos no mayores al n9mero dado, que est definida as, mayoria n > filter f se pide e$presar f. 4=uede f ser un reductor7 4=or qu#7 1?. i) =rogramar una funcin de orden superior paraCada que dados dos n9meros (ndice inicial y final), un valor inicial de un dato y una funcin que dado un dato y un ndice devuelve un dato, devuelva la aplicacin sucesiva de la funcin dada sobre el dato inicial y cada uno de los valores desde el ndice inicial 6asta el final. ii) =rogramar una funcin todos que dada una lista de elementos y una condicin sobre los elementos devuelva si todos los elementos de la lista cumplen con la condicin. @sar paraAada, long y term. +n /as0ell se llama all. iii) =rogramar una funcin ninguno que dada una lista de elementos y una condicin sobre los elementos devuelva si ninguno de los elementos de la lista cumple con la condicin. @sar todos. iv) =rogramar la funcin igLong, que dada una lista de listas, diga si todas las sublistas tienen igual longitud. Bsumir que la lista de listas no debe ser vaca. @sar todos, long y ultimo. 11. i) Definir la funcin !"ile, que dado un valor, una funcin que represente una condicin y una funcin de transformacin, devuelva la aplicacin sucesiva de la funcin de transformacin sobre el valor dado mientras se cumpla la funcincondicin dada. Ci el valor inicial cumple la funcin-condicin, ese valor deber ser el devuelto. ii) Definir la funcin until, que dado un valor, una funcin que represente una condicin y una funcin de transformacin, devuelva la aplicacin sucesiva de la funcin de transformacin sobre el valor dado 6asta que se cumpla la funcincondicin dada. (a funcin de transformacin debe aplicarse una ve% como mnimo. iii) Definir ultimo usando D6ile.

Pgina #

Universidad CAECE Paradigmas de Lenguajes de Programacin

iv) Definir long, append, sumaLista y genLista usando D6ile. Aomparar estas funciones con las equivalentes reali%adas en un lengua*e imperativo usando la estructura de control de iteracin. 1". i) Definir una funcin currificada map, que dada una funcin y una lista como argumentos, devuelve otra lista que es el resultado de aplicar la funcin original (elemento a elemento) a cada uno de los elementos de la lista original. +*, map f -1,",&. -f 1,f ",f &.. +n /as0ell esta funcin no se aplica a listas, sino a e$presiones de un tipo perteneciente a la clase Eunctor. ii) Definir la funcin mapn, como la versin no currificada de map. 1&. i) Definir una funcin no currificada mapn#, que aplique una funcin a todos los elementos de todas las listas de una lista de listas. ii) Definir una funcin map# como la funcin currificada de mapn" usando map. iii) Definir otra versin de map# usando la funcin infi*a o. 1'. Definir una funcin mapAr$, una versin de map que en lugar de recibir una lista, recibe un elemento de tipo BrbFin (rbol binario). 1). i) Definir una funcin mapo, una versin de map que toma una funcin de dos argumentos y una lista de pares de valores, y devuelve la lista de aplicaciones de la funcin a cada par. 45u# se puede concluir7 ii) Definir una funcin mapo#, una versin de mapo que toma una funcin currificada de dos argumentos y dos listas (de igual longitud), y devuelve una lista de aplicaciones de la funcin a cada elemento correspondiente a las dos listas. +sta funcin en /as0ell se llama %ipGit6. iii) 1odificar la funcin mapo" anterior (si lo cree necesario) para que pueda ser usada por una funcin sumamat, que suma dos matrices y devuelve otra matri%. Bsumir que las dos matrices de entrada tienen la misma cantidad de filas y de columnas. +$plicitar adems a qu# tipo es equivalente el tipo matri%. 13. Ci $s es una lista, la evaluacin de map f (map g $s), $s requiere recorrer dos veces la lista $s. Cimplificar la e$presin de modo que slo deba recorr#rsela una ve%, definiendo una funcin simplif, que reciba las dos funciones y la lista. 18. Definir una funcin sigma que calcule la suma de una serie. (os parmetros son loDer (lmite inferior de la sumatoria), upper (lmite superior) y una funcin que indique el t#rmino general en la serie. @sar las funciones suma(ista, y map. 1:. Definir una funcin pascal que devuelva en forma de listas el tringulo de =ascal (o de Hartaglia) 6asta la altura pedida. Io se permite el uso de n9meros combinatorios. @sar ultimo, paresAonsec (funcin que dada una lista devuelve todos los pares de elementos *unto a su sucesor) y map. +*emplo de paresAonsec, paresAonsec -8,&,",). -(8,&),(&,"),(",)).. +*, pascal ' - -1., -1,1., -1,",1., -1,&,&,1., -1,',3,',1. . 1<. i) Definir la funcin de orden superior mapear%, que dada una lista de funciones y una lista (donde ambas tienen la misma cantidad de elementos), devuelva otra
Pgina &

Universidad CAECE Paradigmas de Lenguajes de Programacin

lista con cada resultado de la aplicacin de cada funcin a su elemento correspondiente de la lista. ii) Definir la funcin paresEnPosic, que dada una lista de enteros, devuelva si en cada posicin i-#sima de la lista se encuentra el i-#simo par natural positivo. @sar mapearE. "?. Decir cul es el tipo ms general de f (si es posible calcularlo) cuya definicin es, i) f ($,y) > mapn ($,($ y)) ii) f ($,y,%) > mapn ($,($ y),%) iii) f > map map iv) f > curry JoJ curry "1. i) +$plique a grandes rasgos las principales diferencias entre recursin de pila y de cola. ii) +numere funciones anteriores que puedan definirse de una forma ms sencilla con recursin de pila que de cola, y viceversa. "". Definir las funciones factorial, suma (todos los elementos de una lista), rev, append y aparear de manera que sean recursivas de cola. "&. i) Definir las funciones par (devuelve si un n9mero es par o no) e impar usando recursin mutua (indirecta). ii) Definir las funciones cong', cong1 y cong# (devuelve si un n9mero es congruente a cero, uno o dos respectivamente) usando recursin mutua. "'. Dadas las siguientes funciones, foldr ,, (a b b) b -a. b foldr f b -. > b foldr f b ($,$s) > f $ (foldr f b $s) foldl ,, (b a b) b -a. b foldl f b -. > b foldl f b ($,$s) > foldl f (f b $) $s i) ii) iii) iv) +valuar a mano foldr (K) ? -8,&,1&. y foldl (K) ? -8,&,1&. +valuar a mano foldr append -1. - -".,-&.,-'. . y foldl append -1. - -".,-&.,-'. . Cacar conclusiones sobre las evaluaciones anteriores. Alasificar a foldr y foldl seg9n el tipo de recursin.

"). i) Definir usando foldr las funciones sumaLista (todos los elementos de una lista), idL (identidad de una lista), mem$er, append, rev, norma# (de un vector representado como lista de n9meros), flat, insort (ordenamiento de una lista seg9n el m#todo de insercin), partes, comp%uncs (composicin de cero, una o ms funciones), filter y map. ii) Definir las funciones anteriores, esta ve% usando foldl en lugar de foldr (cuando sea posible). 4Aundo puede no ser posible7 iii) Definir la funcin sumaAlt, que reali%a la suma alternada de los elementos de una lista (da como resultado el primer elemento menos el segundo ms el tercero menos el cuarto y as) usando foldr. 4=or qu# no se puede 6acer usando foldl7
Pgina (

Universidad CAECE Paradigmas de Lenguajes de Programacin

"3. i) Definir la funcin esPrimo, que dado un n9mero dice si es primo o no. @sar map, foldr y . Aonsiderar (si 6ace falta) que 1 es primo. ii) Aalcular la cantidad de primos melli%os menores a 1??? con el reductor cant)ell. Dos n9meros se dicen primos melli%os si ambos son primos y su diferencia es ". @sar , map, es=rimo y foldr. "8. Dada la siguiente funcin (variante de foldr), foldrL ,, (c b b) (a c) b -a. b foldrL f g b -. > b foldrL f g b ($,$s) > f (g $) (foldrL f g b $s) @sarla para definir sumaLista, long y map. ":. i) Definir una variante de foldr para usarla en la definicin de la funcin maxl. ii) Definir una variante de foldr para usarla sobre el tipo BrbFin (rboles binarios rotulados), y otra versin sobre el tipo BrbFinMot/o* (rboles binarios con rtulos slo en las 6o*as). iii) Definir una variante de foldr para usarla en la definicin de la funcin duplicados, que tome una lista y devuelva otra con los elementos que aparecan ms de una ve% en la lista original. +*, duplicados -1,",&,",1. -1,".. "<. i) =rogramar una funcin cant currificada usando foldr por un lado y foldl por otro, que dada una funcin que refle*a una condicin y una lista, devuelva la cantidad de elementos que cumplen la condicin. 4=or qu#N las dos versiones (usando foldr y foldl) son tan similares7 ii) =rogramar una funcin cantll no currificada que dada una funcin que refle*a una condicin y una lista de listas, devuelva la cantidad total de elementos (de cada una de las sublistas) que cumplen la condicin. @sar las funciones cant, foldr y map. iii) Odem ii) pero usando solamente cant y foldr (sin usar map). &?. i) Definir una funcin currificada appendCond que concatene aquellas listas de a en las que todos sus elementos cumplan una determinada condicin. Mecibe una lista de listas de a y una condicin a verificar aplicable a un dato de tipo a (si la condicin se cumple, devuelve verdadero). Ci alg9n elemento de la lista no cumple con la condicin, esa lista se descarta de la concatenacin. @sar map y foldr. ii) 1odificar la funcin anterior para que reciba tambi#n una tolerancia en la cantidad de elementos por lista que deban cumplir con la condicin. +s decir que en lugar de concatenar slo las listas en donde todos sus elementos cumplen la condicin, concatena aquellas que tengan al menos t elementos que cumplan la condicin (t es la tolerancia). Ci una lista tiene menos de t elementos, no ser concatenada. &1. i) Definir una variante de foldr y utili%arla para crear una funcin ordenada que dada una lista de elementos y una relacin de orden entre los elementos devuelve si la lista est o no ordenada. (a funcin debe ser currificada y la lista no debe ser vaca.
Pgina *

Universidad CAECE Paradigmas de Lenguajes de Programacin

ii) 45u# similitudPdiferencia tendra con una variante similar de foldl7 iii) =rogramar una funcin llordenada que diga si una lista de listas est ordenada seg9n una relacin de orden. @sar la variante de foldr de i), ordenada, ultimo y alguna funcin propia. @na lista de listas est ordenada si el flat de esa lista de listas devuelve una lista ordenada. (a lista de listas no puede ser vaca. &". i) Definir la funcin de orden superior foldr+n, que dada una funcin, un caso base, y una lista de listas, aplique sucesivamente la funcin dada a cada lista i compuesta de todos los elementos i-#simos de todas las sublistas. @sar map, cabe%a y resto. Bsumir que la lista de listas es no vaca, y que todos sus elementos-listas tienen la misma longitud. +*, foldr-n f b --$1,$"., -y1,y"., -%1,%".. f -$1,y1,%1. (f -$",y",%". b) ii) Definir la funcin de orden superior foldr+n# (variante de foldr-n y generali%acin de mapo"), que dada una funcin, un caso base, y una lista de listas, aplique sucesivamente la funcin dada a cada elemento i-#simo de las listas-elementos de la lista de listas dada, devolviendo el resultado en la posicin i-#sima de la lista resultado. Bsumir que la lista de listas es no vaca, y que todos sus elementos-listas tienen la misma longitud. @sar foldr, foldr-n y map. +*, foldr-n" f b --$1,$"., -y1,y"., -%1,%".. -foldr f b -$1,y1,%1., foldr f b -$",y",%".. iii) Odem ii), pero usando foldr y mapo". &&. i) Bsumiendo que e$iste un tipo 1atri% como redefinicin del tipo --Eloat.. (representada como una lista de sus filas, con todos sus elementos-listas de igual longitud), y un tipo ;ector como redefinicin del tipo -Eloat., completar las siguientes definiciones (reempla%ando a las letras en cursiva), prod;ect v1 v" > foldr (K) ? f1 prod1at;ect m v > map f2 m traspuesta m > foldr-n f3 g3 m traspuesta" m > foldr-n" f4 g4 m prod1at m1 m" > D6ere nt > traspuesta m" =roducto de vectores =roducto de matri% por vector Hraspuesta de una matri% ! map f5 m1 =roducto de matrices

ii) Definir de otra forma a la funcin prod)at. @sar funciones anteriores, map, prod;ect, uncurry y una funcin lista=ares declarada y definida as, lista=ares ,, (-a., -b.) --(a, b).. lista=ares ($s, ys) > map (Qi map (Q* (i, *)) ys) $s

Pgina ,

Você também pode gostar