Introducción a la programación funcional

in #spanish8 years ago (edited)

LearnPython009c7.png

Esta es una pequeña introducción sobre programación funcional. Para las personas nuevas en programación intentare definir los diferentes estilos de programación.

Los lenguajes de programación pueden descomponer problemas en diferentes tipos de formas, la programación funcional es un estilo para procesar estos problemas.

La mayoría de la programación es hecha de forma procedural, es decir que envías una serie de comandos que le dicen a la computadora que hacer. Un ejemplo de estos lenguajes pueden ser C, Pascal y BASH.

Otro estilo que existe es una declarativa, la cual escribes la forma en el que el problema será resuelta, y el lenguaje de implementación encuentra la forma de ejecutar el computo. SQL es un buen ejemplo de lo que es un lenguaje declarativo.

Orientado a objetos, es la forma más popular de los lenguajes en estos momentos, para manipular colecciones de objetos. Los objetos tienen una forma interna en la cual soportan métodos para buscar o modificar el estado interno. Smalltalk, Java, y otros lenguajes orientados a objetos como C++, Python, y otros lenguajes orientados a objetos, pero no force el uso de la funcionalidad orientada a objetos.

Los diseñadores de algunos lenguajes de computación escoge enfatizar una particular enfoque a la programación. Esto hace difícil escribir programas que usan diferentes enfoques. Otros lenguajes multíparadigma utilizan diferentes estilos de enfoques. Lisp, C++, y Python, son multi-paradigma; puedes escribir programas o librerías que son altamente procedural, orientado a objetos, pero son funcionales en todos esos lenguajes. En un gran programa, secciones diferentes pueden ser escritos usando diferentes enfoques; la interfaz gráfica pueden ser orientadas a objetos mientras el procesamiento lógico es procedural o funcional, por ejemplo.

En un programa funcional, inserción fluye a traves de un conjunto de funciones. Cada función, opera en una inserción y produce alguna salida. Estilos de funcional mitiga los efectos colaterales de modificar el estado interno o crear nuevos cambios que no son visibles en los valores regresados por las funciones. Funciones que no tienen estos efectos laterales pueden ser llamados puramente funcionales. Evitar efectos laterales significa que no están usando estructuras de datos que pueden ser actualizadas mientras se ejecuta el programa; cada retorno de la función deberá depender exclusivamente de su entrada.

Algunos lenguajes son muy estrictos sobre la pureza y ni siquiera tienen una instrucción de asignación tal como a=3 o c= a + b, pero es difícil evitar todos los efectos laterales. Imprimir a la pantalla o escribir al disco son efectos laterales. Por ejemplo, en Python una instrucción como print() o una como time.sleep(1) regresarán valores útiles; estas solo son llamadas por efectos laterales de envío de algún texto a la pantalla pausando la ejecución por un segundo.

Los programas de Python son escritos en estilos funcionales, usualmente no irán al extremo de evitar todas las asignaciones de entrada y salida, en vez de eso, estas proveerán una interfaz casi funcional, que usará funcionalidades no funcionales de forma interna. Por ejemplo, la implementación de una función usará los asignaturas a una variable local, pero no modificará la variable de forma global o generará más efectos laterales.

La programación funcional puede ser considerada lo opuesto a la programación orientada a objetos. Objetos son como pequeñas capsulas que contienen algún tipo de estado interno junto con una colección de llamadas a métodos que te permitirán modificar su estado, y los programas creados dependen de estas modificaciones para funcionar. La programación funcional quiere evitar estos cambios de estado lo más posible y trabajar con el flujo de datos entre funciones. En python quizas tendrás que combinar ambos estilos escribiendo funciones que toman y devuelven instancias representando objetos en tus aplicaciones (como mensajes de correo electrónico, transacciones, etc).

El diseño funcional puede ser un estilo un tanto extraño y restringido para trabajar. Por que querría uno evitar objetos y efectos laterales? Las ventajas son tanto teóricas como practicas a estos estilos:

  • Probabilidad formal
  • Modularidad
  • Construcción
  • Facilidad en pruebas y corrección de errores

Probabilidad formal

Un beneficio teoretico que puede ser mas facil de construir en una prueba matemática que hace que un programa funcional este correcto.

Por mucho tiempo, investigadores han estado interesados en encontrar formas para matemáticamente probar que un programa es correcto. Esto es diferente a hacer pruebas, en numerosas entradas y conclusiones que estas salidas son usualmente correctas, o leyendo el código fuente de un programa y concluir que el código se ve bien; la meta es de una rigurosa prueba para que el programa produzca el resultado correcto bajo cualquier posible entrada.

La técnica usada para proveer que el programa sea correcto es el de escribir invariantes, propiedades de los datos entrantes y variables de los programas que son siempre verdaderas. Para cada línea de código, mostrarás la invariantes X y Y son verdaderas antes que la linea sea ejecutada, las ligeramente diferentes invariantes X' y Y' son verdaderas despues que la línea fue ejecutada. Esto continua hasta que alcances el final del programa, y que en un punto las invariantes deberán ser iguales que las condiciones esperadas en el resultado del programa.

La razón para evitar asignaciones en la programación funcional es por que las asignaciones son difíciles de manejar con esta técnica; unas asignaciones pueden romper las invariantes que fueron verdaderas antes que las asignación sin producir una nueva invariante se propague en adelante.

Desafortunadamente, proveer programas correctamente es en su mayoría impractico y no relevante al software de Python. Aún programas triviales requieren pruebas, que son múltiples hojas de extensión; la prueba de corrección para un programa moderadamente complicado sería enorme, y pocos o ninguno de los programas que se usan comúnmente (como el interprete de Python, tu procesador XML, o tu navegador de Internet) pueden ser probados correctamente. Aún cuando escribes o generes una prueba, existirá la pregunta de verificación de la prueba; quizas hubo un error en esta, y erróneamente crees que fue probado el programa correctamente.

Modularidad

Un beneficio más práctico de la programación funcional es el que te force a separar un problema en pedazos más pequeños. Programas que son más pequeños como resultados. Son más fáciles de especificar y escribir una función pequeña que haga una sola cosa en vez de una función larga que haga transformaciones complejas. Las funciones pequeñas también son mas fáciles de leer y revisar errores.

Facilidad de corrección de errores y pruebas

Pruebas y corrección de errores en un programa funcional es mucho más fácil.

La corrección de errores es simplificado por que las funciones son generalmente pequeñas y claramente especificadas. Cuando un programa no funciona, cada función es una interfaz que apunta a donde puedes verificar que los datos son correctos. Puedes observar que las entradas inmediatas y salidas son rápidamente aisladas de la función que es responsable por un bug.

Probar es más fácil por que cada función es potencialmente sujeta a una prueba de unidad. Funciones que no dependen en el estado del sistema pueden necesitar ser replicadas antes que se ejecute una prueba; en vez de esto solo necesitas sintetizar la primera entrada y checar que la salida sea la esperada.

Construcción

Mientras trabajas con programas escritos en estilo funcional, escribirás un número de funciones con entradas y salidas variables. Alguno de estas funciones serán sin opciones, escritas especializadas a una aplicación particular, pero otras serán útiles a una gran variedad de programas. Por ejemplo, una función que toma la ruta de un directorio y retorna todos los archivos XML dentro de un directorio, o una función que toma el nombre de un archivo y retorna todo el contenido, puede ser aplicado en diferentes situaciones.

Con el tiempo, acumularas una librería personal de utilidades. Comúnmente ensamblaras nuevos programas acomodando funciones existentes en una nueva configuración y escribir solo unas cuantas funciones especializadas para completar la tarea.

Firma digital de Bitcoin: H3yHHIyxgh1ps/O6ZUByymvtil+MiFV2Z/DRM3cS1GmveKMCszPITCOxtlS1djHmL4JuWuSRgIOcvPx5AAy5wJU=
Dirección de Bitcoin: 1Ddm2TTRTmJZCnaLWb2sybmfaaf4AkfoXH


JZA

About me:
Steemer, crypto fan, like to listen to 90s hip hop, and loves to chat about Linux Python and Free software. Runs a local Tech club in sunny Cancun, and enjoys hoping on planes and landing somewhere else.

Sort:  

This post has been linked to from another place on Steem.

Learn more about linkback bot v0.4. Upvote if you want the bot to continue posting linkbacks for your posts. Flag if otherwise.

Built by @ontofractal

Coin Marketplace

STEEM 0.18
TRX 0.13
JST 0.028
BTC 64605.20
ETH 3168.25
USDT 1.00
SBD 2.53