lunes, 28 de noviembre de 2016

First Class Functions



El concepto de First Class Functions, nos indica que una función no difiere de otro tipo de datos usados en un programa. Esto indica que se puede utilizar como parámetros de una función o ser  retornado por una función. Esto permite escribir código altamente reutilizable y a la vez nos permite componer funciones, es decir obtener una función a raíz de otras.

Supongamos que tenemos una función incEven que toma un número n si es par lo incrementa, de lo contrario devuelve el número sin cambios.

ifEvenInc n = if even n
               then n + 1
               else n                    

Más tarde descubrimos que necesitamos dos funciones más: doubleEven y squareEven, ese doble y cuadrado números pares, respectivamente. Estas serían funciones fáciles de escribir dado que sabemos cómo escribir incEven:

 ifEvenDouble n = if even n
                  then n * 2
                  else n
 
 
 ifEvenSquare n = if even n
                      then n^2
                      else n

Aunque estas funciones eran fáciles de escribir, las tres son casi idénticas. La única diferencia es el comportamiento de incrementar, duplicar y elevar al cuadrado. Lo que hemos descubierto aquí es un patrón general de cálculo que podemos abstraer. Para hacer esto necesitamos la capacidad de pasar una función como un argumento para realizar el comportamiento deseado.

Vamos a demostrar esto con la función ifEven que toma una función y un número como argumentos. Si ese número es par aplica la función a ese número:

ifEven myFunction x = if even x
                       then myFunction x
                       else x

También podemos abstraer nuestro comportamiento de incrementar, duplicar y elevar al cuadrado en tres funciones separadas:

inc n = n + 1
double n = n*2
square n = n^2

Vamos a recrear nuestras definiciones anteriores usando el poder de las funciones de primera clase:

 ifEvenInc n = ifEven inc n
 ifEvenDouble n = ifEven double n
 ifEvenSquare n = ifEven square n

Ahora podemos agregar nuevas funciones muy fácilmente como ifEvenCube, ifEvenNegate, etc.

Dejo link: http://freecontent.manning.com/learning-haskell-first-class-functions/