Universidad CAECE Paradigmas de Lenguajes de Programación

PRÁCTICA 3 Funciones de orden superior
1. Definir una función esCerrada, que dada una lista y una función binaria (que toma un par de elementos del tipo de la lista y devuelve un elemento del tipo de la lista) devuelve si la función es cerrada respecto a la lista de entrada (o sea, si la imagen de la función --tomando como dominio la lista-- está incluída en esta lista dominio!).

". i) Definir una función maxf, que dada una función con dominio e imagen en un tipo num#rico ordenado y una lista (de tipo dominio de la función 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 mínimo) usando ma$f y la negación unaria (negate). &. i) Definir una función supf, que dadas dos funciones del mismo dominio e imagen, devuelva la función 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 mínimo) usando supf. '. i) Definir una función genLista que genere una lista de una cantidad dada de elementos a partir de un elemento inicial dado y de una función dada que represente la función 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 función filter que depura una lista, de*ando sólo aquellos elementos que cumplen con una condición dada. +sta condición está refle*ada en una función booleana. +*, filter even -1,",&,',). → -",'.. +n /as0ell esta función 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 función infi*a o de composición de funciones. +n /as0ell esta función está predefinida y se llama (.). 45u# restricciones 6abrá que 6acerle respecto a la composición matemática7 ii) Definir ultimo y segundo (devuelve el segundo elemento de una lista) usando la función o. 8. i) Definir la función curry, que dada una función de dos argumentos, devuelve su equivalente currificada. 45u# limitaciones debe tener esta función7 ii) Definir la función uncurry, que dada una función currificada de dos argumentos, devuelva su versión no currificada equivalente. iii) 45u# diferencia fundamental e$iste entre una función currificada y su equivalente no currificada7 1ostrar algunos e*emplos en que la currificación resulte beneficiosa. 4+$iste una manera 9nica de currificar una función7 iv) Discuta la posibilidad de definir una función curryN, que tome una función de un n9mero arbitrario de argumentos (aunque siempre en formato de producto cartesiano de dos tipos) y devuelva su versión currificada.
Página 1

iii) Definir ultimo usando D6ile. ese valor deberá ser el devuelto. long y ultimo. (a función de transformación debe aplicarse una ve% como mínimo. i) Definir la función !"ile. i) Definir las versiones currificadas y no currificadas suma de dos enteros y division entera de dos enteros. ii) =rogramar una versión currificada de separar usando filter. que dado un valor. i) =rogramar la función no currificada separar. y devuelve otra lista de listas de n9meros. @sar paraAada. una función que represente una condición y una función de transformación. ii) =rogramar una función todos que dada una lista de elementos y una condición sobre los elementos devuelva si todos los elementos de la lista cumplen con la condición. Ci el valor inicial cumple la función-condición. devuelva la aplicación sucesiva de la función de transformación sobre el valor dado 6asta que se cumpla la funcióncondición dada. long y term. devuelva la aplicación sucesiva de la función dada sobre el dato inicial y cada uno de los valores desde el índice inicial 6asta el final. mayoria n > filter f se pide e$presar f. Bsumir que la lista de listas no debe ser vacía. ii) Definir --usando funciones currificadas anteriores-. predecesor de un entero.eces. i) =rogramar una función de orden superior paraCada que dados dos n9meros (índice inicial y final). @sar todos. iv) =rogramar la función igLong. diga si todas las sublistas tienen igual longitud. @sar todos. iii) =rogramar una función ninguno que dada una lista de elementos y una condición sobre los elementos devuelva si ninguno de los elementos de la lista cumple con la condición. iii) Dada una función mayoria que recibe un n9mero y una lista de listas de n9meros. mitad de un entero y dos eces la aplicación de una función. <. 4=uede f ser un reductor7 4=or qu#7 1?.a las funciones sucesor de un entero. por aquellos que no la cumplen. 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. iii) Definir cuatro eces usando dos. que dada una lista de listas. 11. que dada una condición y una lista devuelva un par de listas donde la primera est# conformada por aquellos elementos de la lista original que cumplan con la condición. +n /as0ell se llama all. devuelva la aplicación sucesiva de la función de transformación sobre el valor dado mientras se cumpla la funcióncondición dada. ii) Definir la función until. que está definida así. que dado un valor. una función que represente una condición y una función de transformación. Página # . un valor inicial de un dato y una función que dado un dato y un índice devuelve un dato.Universidad CAECE Paradigmas de Lenguajes de Programación :. y la segunda.

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

esta ve% usando foldl en lugar de foldr (cuando sea posible). "?. @sar mapearE. i) Definir usando foldr las funciones sumaLista (todos los elementos de una lista). y foldl (K) ? -8.($ y)) ii) f ($.$s) > foldl f (f b $) $s i) ii) iii) iv) +valuar a mano foldr (K) ? -8..1&. devuelva si en cada posición i-#sima de la lista se encuentra el i-#simo par natural positivo. rev. append y aparear de manera que sean recursivas de cola. i) +$plique a grandes rasgos las principales diferencias entre recursión de pila y de cola.($ y).y.%) iii) f > map map iv) f > curry JoJ curry "1. ii) Definir las funciones anteriores. "'.. insort (ordenamiento de una lista seg9n el m#todo de inserción). Cacar conclusiones sobre las evaluaciones anteriores. .. 4=or qu# no se puede 6acer usando foldl7 Página ( . flat.-&. ii) +numere funciones anteriores que puedan definirse de una forma más sencilla con recursión de pila que de cola. "). Definir las funciones factorial. > b foldl f b ($.Universidad CAECE Paradigmas de Lenguajes de Programación lista con cada resultado de la aplicación de cada función a su elemento correspondiente de la lista. partes. que dada una lista de enteros. > b foldr f b ($. filter y map. . y foldl append -1. rev. "&. mem$er. .. que reali%a la suma alternada de los elementos de una lista (da como resultado el primer elemento menos el segundo más el tercero menos el cuarto y así) usando foldr.$s) > f $ (foldr f b $s) foldl .. idL (identidad de una lista).-".-". "".-'. . (a → b → b) → b → -a. Decir cuál es el tipo más general de f (si es posible calcularlo) cuya definición es.y) > mapn ($.%) > mapn ($. norma# (de un vector representado como lista de n9meros). Alasificar a foldr y foldl seg9n el tipo de recursión. una o más funciones). ii) Definir las funciones cong'. foldr .&.-'. +valuar a mano foldr append -1. comp%uncs (composición de cero. append. i) Definir las funciones par (devuelve si un n9mero es par o no) e impar usando recursión mutua (indirecta). cong1 y cong# (devuelve si un n9mero es congruente a cero.1&. → b foldr f b -. 4Auándo puede no ser posible7 iii) Definir la función sumaAlt.&. i) f ($. ii) Definir la función paresEnPosic..-&. Dadas las siguientes funciones. suma (todos los elementos de una lista). → b foldl f b -. y viceversa. (b → a → b) → b → -a. uno o dos respectivamente) usando recursión mutua.

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

..%". .y".y1. *)) ys) $s Página . ordenada. un caso base.. y que todos sus elementos-listas tienen la misma longitud. → f -$1. @sar la variante de foldr de i). &". que dada una función. b) ii) Definir la función de orden superior foldr+n# (variante de foldr-n y generali%ación de mapo").$". iii) Odem ii).ect. ultimo y alguna función propia. (representada como una lista de sus filas. un caso base.. Bsumir que la lista de listas es no vacía. con todos sus elementos-listas de igual longitud). map. @sar funciones anteriores.%". foldr-n f b --$1. pero usando foldr y mapo". @na lista de listas está ordenada si el flat de esa lista de listas devuelve una lista ordenada. i) Definir la función de orden superior foldr+n. y un tipo . @sar map. (f -$". ys) > map (Qi → map (Q* → (i. Bsumir que la lista de listas es no vacía. → -foldr f b -$1.y". completar las siguientes definiciones (reempla%ando a las letras en cursiva).y". -%1. cabe%a y resto. prod. +*. i) Bsumiendo que e$iste un tipo 1atri% como redefinición del tipo --Eloat. (-a. -y1. -%1. @sar foldr.. y una lista de listas. -b. foldr-n" f b --$1. -y1.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 función prod)at.y1. devolviendo el resultado en la posición i-#sima de la lista resultado. lista=ares ($s. que dada una función..$". lista=ares ..ector como redefinición del tipo -Eloat. uncurry y una función lista=ares declarada y definida así. &&. (a lista de listas no puede ser vacía.y".ect v1 v" > foldr (K) ? f1 prod1at. b).) → --(a. y que todos sus elementos-listas tienen la misma longitud.. foldr f b -$".. prod.Universidad CAECE Paradigmas de Lenguajes de Programación ii) 45u# similitudPdiferencia tendría con una variante similar de foldl7 iii) =rogramar una función llordenada que diga si una lista de listas está ordenada seg9n una relación de orden..%". +*. foldr-n y map. aplique sucesivamente la función dada a cada elemento i-#simo de las listas-elementos de la lista de listas dada. y una lista de listas.%1..%". aplique sucesivamente la función dada a cada lista i compuesta de todos los elementos i-#simos de todas las sublistas.%1...