Orden Superior Tanto en matemĆ”tica como en informĆ”tica, se definen las funciones de orden superior como funciones que reciben funciones por parĆ”metro o bien devuelven una función como resultado. Este concepto, como veremos a lo largo de la materia, es de los que tildamos como trasversales, ya que no se da Ćŗnicamente en el paradigma funcional. Supongamos que volvemos al dominio de los alumnos y tenemos lo siguiente: aprueba notas = (notas !! 0 >= 4) && (notas !! 1 >= 4) && (notas !! 2 >= 4) (recordemos que lista !! indice me devuelve el valor de la lista en ese Ćndice) El objetivo de esa función es saber si todas las notas son mayores a 4. Si bien hace lo que queremos la solución es bastante criticable porque repite mucho código (sumado a que estĆ” limitado a 3 elementos, quĆ© pasa si hay una cantidad variable de elementos?). Lo que podemos hacer es separar el algoritmo de saber si cada nota cumple con la condición que queremos de la condición en sĆ. Para eso podemos usar una función de orden superior que trae Haskell: aprueba notas = all esNotaAprobada notas esNotaAprobada nota = nota >= 4 Iterar la lista para aplicar la función a cada elemento ya no es nuestro problema, de hecho, iterar nunca es un fin sino un medio, se lo podemos delegar al motor y dedicarnos a pensar cosas mĆ”s interesantes. Hay muchas funciones de orden superior que nos van a servir para nuestros programas. Algunos ejemplos: filter: Recibe un criterio y una lista y retorna la lista con aquellos elementos que cumplan el criterio map: Recibe una función de transformación y una lista y retorna la lista con los resultados de aplicar cada elemento a la transformación any: Recibe un criterio y una lista y retorna true si algĆŗn elemento cumple con el criterio. Conclusiones de Orden Superior:
Variables de tipo CuĆ”l serĆ” el tipo de all? En base al uso vemos que recibe una función como primer argumento y una lista como segundo. AdemĆ”s de eso notamos que existe una relación entre el tipo de los elementos de la lista y el dominio de la función esNotaAprobada, y ademĆ”s el all me pide que la función retorne un Bool, entonces el tipo de all es algo asĆ: all :: (a -> Bool) -> [a] -> Bool Las funciones las ponemos entre parĆ©ntesis, por ende, por mĆ”s que haya 3 flechitas, la cantidad de parĆ”metros de all es 2, la función y la lista. Por quĆ© ponemos a y no Int por ejemplo? nuestras notas no son enteros? SĆ, pero el all funciona para listas de cualquier cosa! Lo Ćŗnico que nos pide es que la función que le pasemos reciba algo del tipo de esos elementos para poder pasĆ”rselos. CuĆ”l es el tipo de filter y map en base a lo que sabemos? filter :: (a -> Bool) -> [a] -> [a] map :: (a -> b) -> [a] -> [b] Este grado de libertad hace que sea posible trabajar con cualquier tipo de lista que se nos ocurra sin tener que volver a definir el algoritmo general. A las funciones de este estilo vamos a decir que son polimórficas. |