Ir al contenido principal

Paradigma Funcional de Programación


Hola bienvenidos a StudentPlace, no sé por que siempre empiezo utilizando la misma frase, en fin, ¿Por qué hablaremos de programación funcional el día de hoy? Pues para ser sincero me dejaron investigar de ello y... bueno, son dos pájaros de un solo tiro, si lo que investigo te sirve en posterior pues que mejor.

En fin comencemos. Para iniciar creo que debemos definir como primera instancia ¿Qué es un paradigma? Si no mal recuerdo ya lo había explicado en otra entrada, sin embargo no queda en mal recordarlo, ademas capaz se entiende mejor esta vez.

Paradigma: conjunto de características comunes que definen una cierta estructura o forma de funcionar de un lenguaje de programación. 

En resumen podemos decir simplemente que un paradigma es una forma o estilo de programación, cada quien tiene una forma especial de programar, sin embargo un paradigma va mas allá, puesto que engloba una serie de técnicas comunes que son utilizadas por muchas personas a la hora de escribir código y hoy en día incluso forman parte de la misma sintaxis de varios lenguajes.



Un poco de Historia:

La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los años 1930 para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda.

¿Que rayos es el cálculo lambda?
Es el más pequeño lenguaje universal de programación, consiste en una regla de transformación simple (sustituir variables) y un esquema simple para definir funciones. El cálculo lambda se puede decir que es equivalente a las máquinas Turing porque es capaz de evaluar y expresar cualquier función computable.

Para no hacer la historia muy larga, esto comenzó con Alonzo Church, un matemático en la universidad de Princeton en E.U.A. y prácticamente, el fue la persona que invento el calculo de lambda. El estaba interesado más que nada en la noción de una función desde el aspecto computacional.

Un dato curioso es que precisamente el fue el supervisor directo de Alan Turing, conocido hoy en día por crear la maquina que lleva su nombre, las cuales capturan un modelo computacional basado en estados. Lo que es interesante, es que su supervisor, Alonzo, capturó en modelo computacional basado en funciones en base al calculo de lambda. Lo que es mas curioso es que estas dos nociones, aunque distintas entre si terminaron siendo equivalentes, y a esto es lo que se le conoce como la hipótesis de Church-Turing.

En fin, para Church, una función era básicamente una caja negra donde no estas autorizado para ver dentro, y lo que hace es tomar una entrada de información, digamos un numero X, el cual va a ser procesado de alguna forma y va a producir una salida ("respuesta") de información, que puede ser por ejemplo x+1.


Lo que es importante aquí es, por un lado, no puedes ver el interior de estas cajas, es decir, observar el funcionamiento interno, y por otro lado no hay estados internos, es decir, no hay pasos desglosados del funcionamiento, se basa en funciones meramente matemáticas, caso contrario a lo que pasa en una maquina de Turing la cual esta conformada por varios estados y reglas de transición entre esos estados.

Escribir una función en calculo lambda es meramente sencillo, veamos:

 λx . x+1

Aquí simplemente basta con escribir el símbolo lambda seguido de los valores a procesar, seguido de un punto que antecede a la forma en que la salida debe ser calculada. Por ejemplo, si deseamos hacer la función lambda para la suma de dos valores seria:

 λx  λy . x+y

En resumen, la notación del calculo de lambda se basa en tres elementos:
  • Tiene variables como x, y, z.
  • Una forma de construir funciones.
  • Y una forma de aplicar ("resolver") dichas funciones.
¿Cuál es el punto o importancia del cálculo de lambda?

Pues según el profesor Profesor Graham Hutton lo podemos resumir en tres puntos:
  • La codificación: básicamente cualquier programa escrito en cualquier lenguaje de computacional existente o por existir puede ser transformado a la notación del calculo de lambda, esto hace valida la teoría de Church-Turing, puesto que todo sistema escrito en el modelo de Alan Turing (en el que prácticamente se basa toda la computación e informática actual) puede ser transformado a la notación de calculo de lambda y viceversa, haciendo estos dos sistemas equivalentes.
  • Conforma la base de todos los lenguajes de programación funcional.
  • Aunque sea de forma indirecta, está presente en todos los lenguajes de programación actual, como java, c#, python, etc, como componente fundamental.
Conceptos antes de explicar el tema:
Bien, llegados a este punto solamente me queda explicar una cosa mas antes de llegar de lleno al tema, esto es los tipos de programación. En el mundo de la informática y el código, se pueden distinguir una serie paradigmas de programación que engloban a otros mas, estoy hablando de:

Programación Imperativa:
Es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Se le debe de explicar a la computadora por medio de instrucciones detalladas “cómo hay que realizar una tarea”. En resumen, no te compliques la vida, es simple y sencillamente la forma de programar que todos conocemos, declarando variables, indicando operaciones, desarrollando lógica y demás, la forma cotidiana de programar y la primera que nos enseñan, en lenguajes como c, python, java, etc.

Programación Declarativa:
Es un paradigma de programación basado en el desarrollo de programas "declarando" un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen un problema pero no las instrucciones necesarias para resolverlo. La solución se obtiene mediante mecanismos internos. En este tampoco te compliques, mira, si alguna vez en tu vida haz manejado SQL o gestores como MYSQL o POSTGRESQL desde consola utilizando comandos, pues te felicito, ya has manejado un lenguaje declarativo, aunque estos tipos de lenguaje obviamente, mas que en programación están enfocados a bases de datos, igual deja me explico, ¿Te acuerdas de la instrucción? Create table NOMBRE (columna1, columna2, columna3, columnaN); bueno, te apuesto a que no sabes como rayos internamente crea la tabla, ni mucho menos te imaginas como esta estructurado el código de forma interna, pero de que crea la tabla con los nombres de columna deseados, pues si lo hace, ¿No? y básicamente sabes que esta haciendo pues el mismo comando describe que hace, así de simple es un lenguaje de programación declarativo.

En resumen, en uno te encargas tu de desarrollar toda la lógica desde cero y en el otro existe un núcleo del lenguaje que posee todas las definiciones necesarias para el desarrollo de un programa (es decir sus funciones o comandos).

Paradigma Funcional:
En fin, ya dimos una "breve" introducción, ahora si, ¿Qué es el paradigma funcional? Pues la programación funcional es un paradigma de programación declarativa basado en el uso de funciones matemáticas. Aquí los programas se estructuran componiendo expresiones que se evalúan como funciones. Dentro de los lenguajes funcionales tenemos Lisp, Scheme, Clojure, Haskell, OCaml y Standard ML, entre otros.

Características:
Los lenguajes Funcionales son muy diferentes a los englobados como Imperativos, tan solo veamos sus características.
  • NO HAY VARIABLES, NI ASIGNACIONES: O bueno, variables tal cual no existen, aquí una variable por lo regular almacena la declaración de una expresión y una vez que esta es asignada el valor no cambia durante la ejecución del programa, es decir se mantiene inmutable. En lo personal considero que aquí se quedo el nombre "variable" mas por tradición y costumbre que por otra cosa.
  • No hay estructuras cíclicas: Aquí no existe tal cosa como ciclos for, while, do while, etc si no que se emplea la recursividad para emular dichos comportamientos.
  • No tienen estados, evita los efectos colaterales: es decir, al llamar a una función múltiples veces con las mismas entradas siempre devolverá los mismos resultados, estos no se verán influenciados por condiciones externas o estados almacenados previamente. De hecho, incluso en la programación cotidiana al momento de usar funciones, lo correcto es evitar usar variables globales dentro de una función declarada, ¿Por qué? Bueno el chiste es hacer un bloque de código reutilizable e independiente, si este depende de una variable global, estas características se corrompen. A esto último también se le llega a conocer como transparencia referencial, que básicamente significa que podemos reemplazar cualquier referencia a una función por el valor que regresa sin que se altere el resultado o el comportamiento del programa.
Clases de funciones en este paradigma:
Bueno, si hablamos del paradigma funcional podemos encontrarnos básicamente con dos tipos:
  • Funciones como datos de primer orden: para empezar hay que aclarar que una función en si es un dato de primer orden, dicho esto, un dato de primer orden es aquel que:
    • Puede ser asignado a una variable.
    • Puede ser pasado como argumento a una función.
    • Puede ser devuelto como resultado de una invocación a una función.
    • Puede ser parte de un tipo mayor.
  • Funciones de orden superior: (higher order functions en inglés) son aquellas funciones que toman otras como parámetro o devuelven otra función.
Principales Ventajas:
  • El poder ejecutar nuestros programas en entornos que favorecen la ejecución paralela, por aquello de que no existe la posibilidad de que el resultado de una función se vea afectada por elementos externos a ella.
  • Y en general un código más reducido, puesto que se le especifica al programa qué es lo que tiene que hacer y no cómo hacerlo.
Principales Desventajas:
  • Dificultad inicial para producir buen código: Esto debido a que un programador suele estar acostumbrado al pensamiento de la programación imperativa, tomando un poco de tiempo que la persona logre adaptarse y generar código útil.
  • Eficiencia: Si no se pueden modificar datos es necesario crear duplicados que incorporen la modificación.
  • Complejidad de programación: Si no existe un estado externo, se debe enviar a cada función todos los datos necesarios.
  • Sistema de tipado: Es difícil imaginar cómo incorporar un sistema de tipado estricto y/o P.O.O. a un enfoque funcional.

Lenguajes De Programación:


En la actualidad existen una gran variedad de lenguajes que incorporan la programación funcional de manera nativa (como HasKell) o aquellos que lo utilizan pero no al 100% (como java), lo cual es interesante debido a que podemos utilizar las ventajas de estos lenguajes en la programación imperativa. Algunos de estos lenguajes que se pueden mencionar son:
  • Java
  • PHP
  • Ruby
  • Python
  • Elixir
  • Kotling
  • Haskell
  • Erlang
En fin, por hoy es todo, gracias por leerme y espero tengan un buen día.

Fuentes:

Digitales:

Audiovisuales:
Video: Lambda Calculus - Computerphile
Autor/Canal/Responsable: Computerphile
Fecha: 27 ene. 2017
Duración: 12:40 min
Fuente: https://www.youtube.com/watch?v=eis11j_iGMs

Video: Functional Programming & Haskell - Computerphile
Autor/Canal/Responsable: Computerphile
Fecha: 27 ene. 2017
Duración: 12:40 min
Fuente: https://www.youtube.com/watch?v=LnX3B9oaKzw









Comentarios

Publicar un comentario