domingo, 8 de enero de 2012

highorder functions - Funciones de orden superior. (Javascript para programadores funcionales parte 3)

Ya en el artículo de lazy evaluation vimos que es copado pasar funciones por parametro para evitar ejecutar código antes de tiempo.

   High-order function es como se llama a las funciones que reciben funciones por parametro.

   A diferencia del artículo de lazy evaluation, las funciones de esta categoría son funciones que reciben criterios por parametro.

Qué es un criterio? 

Uhm, bueno, hay varias formas de criterio, pero creo que puedo generalizarlos en dos, criterio de consulta y criterio de ejecución. Un criterio de consulta es un computo que me permite saber algo de la ejecución. Un criterio de ejecución es un computo que me permite realizar una acción.

Un caso clarisimo es el if como funcion:

function ifFn (expression, ifTrue, ifFalse) {
  if(expression) ifTrue();
  else ifFalse();
}


Donde expression es un criterio de consulta, que nos dice si sucedio algo y ifTrue / ifFalse son unidades computables.

En este caso, la funcion de orden superior es ifFn, que define un comportamiento general que se termina de definir con las funciones que recibe por parametro.

Esta misma idea puede ser llevada a varios ambitos, sobre todo algoritmicos.


Cuantas veces hemos definido algoritmos identicos en mecanismo pero distintos solo en consulta y modificación? 


Para que vean cuantas veces hicieron cosas una y otra vez por ahi sin terminar de verlo y para terminar de explicar el punto voy a dejar un pequeño catalogo de funciones tipicas de funcional


/* 
   foldr(ight) es una funcion que dada una lista, una funcion y un elemento, retorna la aplicacion de la funcion sobre cada item de la lista y el resultado de la ejecucion anterior como segundo parametro (en el caso de la primera ejecucion del a funcion, el segundo parametro es el elemento recibido por parametro. Recorre la lista de izquierda a derecha
  function suma (a,b) { return a + b }


  foldr([1,2,3,4,5,6,7,8,9], suma, 0) = sumatoria de todos esos numeros (no jodan, no voy a calcularlo)

*/
function foldr (list, funct, aux) {
    for(i in list) {
       aux = funct(list[i], aux);
    }
    return aux;
}


/* Foldl(eft) es igual que foldr, pero recorre la lista de derecha a izquierda */


function foldl (list, fn, aux) {
     return foldr(list.reverse(), fn, aux);
}



/*
  fmap es una funcion que aplica una funcion f sobre cada item de una lista y mapea cada resultado en un array que retorna. 


  Ejemplo de uso: 
  
  fmap(even, [1,2,3,4,5,6]) = [false, true, false, true, false, true]


  function nombre (m) { return m.nombre }


  fmap(nombre, [ {nombre:"jacinto" }, {nombre:"elisa" }, {nombre:"ramona" }] = 
   ["jacinto", "elisa", "ramona"] 


  Matematicamente hablando, fmap transforma un conjunto dado aplicando una funcion de transformación
 **/

function fmap (f, array) {
    var retorno = [];
    for (i in array) {
      retorno.push(f(array[i]));
    }

    return retorno;
}




/*
  Filter es una funcion que filtra items de una lista, segun la funcion parametro 


  ejemplo: 


  filter(even, [1,2,3,4,5,6]) = [2,4,6]
 
*/
function filter (fn, array) {
        var retorno = [];
        for (i in array) {
            if(fn(array[i]) retorno.push(array[i]);
        }
        return retorno;    

}



Tengo varias highorder mas, pero no alcanza lo que explique hasta ahora para poder mostrarlas y que tenga sentido, so, keep tuned. El proximo post viene botines de punta con meta-funciones


> perá perá!! como se lo explico a mamá???

A tu vieja decile

 Una funcion de orden superior es como una señora que limpia, vos le decis que consideras desordenado, y como te gustaria que quede, después te desentendes de como lo hace o en que orden.
 

PD: Foldr es muchisimo mas poderosa de lo que explico aca, pero bue, para mas adelante, tenganla en cuenta :)

No hay comentarios:

Publicar un comentario