/programacion-funcional

Una lista curada🥵 de recursos y conceptos importantes en la programación funcional

Introducción a la programación funcional

Recurso Link
Presentación 👨‍🏫
Video 📹

Conceptos e ideas Importantes

Paradimas declarativos vs imperativos

Imperativos

Una secuencia de operaciones a realizar. Especificamos la secuencia de operaciones utilizando condicionales o ciclos (if, for, while, etc.)

Algunos lenguajes imperativos:

Python

C++

JavaScript

PHP

Declarativos:

Se especifica el resultado deseado, no cómo lograrlo.

Algunos ejemplos de lenguajes declarativos:

Clojure

Haskell

SQL

Erlang

Los diferentes lenguajes de programación declarativos pueden, a su vez, dividirse en dos paradigmas: lenguajes de programación funcional y lenguajes de programación lógica.

Programación Funcional

La programación funcional es un paradigma de programación en el que tratamos de vincular todo en el estilo de funciones matemáticas puras. Utiliza expresiones en lugar de statements.

Se basa en el cálculo lambda

Cálculo Lambda

Es un sistema formal diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Diseñado por Alonzo Church y Stephen Kleene

Funciones

Definición Matemática: regla que asigna a cada elemento de un primer conjunto un único elemento de un segundo conjunto.

Función

Definición en programación: bloque de código que realiza alguna operación. Toma uno o más argumentos y calcula un resultado.

Ejemplos de funciones en Python

  1. Función que toma un parámetro (name) y regresa un mensaje "Hello Daniel", por ejemplo.
def hello(name:str)->str:
    return "Hello, "+name
  1. Función que suma dos números
def add(n1:int, n2:int)->int:
    return n1+n2
  1. Función que suma los valores de un array o lista:
def add_array(array:List[int])->int:
    total:int=0
    for element in array:
        total+=element

Pasemos a un lenguaje diferente, veamos las funciones anteriores en Haskell:

  1. Función que regresa un mensaje de Hello y un nombre que pase:
hello name = "Hello, "++name
  1. Función que suma dos números
add n1 n2 = n1+n2
  1. Función que suma los valores de un array o lista:
Con Prelude
sum [1..5] -> [1, 2, 3, 4, 5]
sum myLista

Recursividad
sumList :: (Num a) => [a] -> a
sumList [] = 0
sumList (x:xs) = x + sum' (xs)

Funciones Puras

P:

Siempre devuelve el mismo resultado para los mismos valores de argumento y no tiene efectos secundarios como modificar un argumento (o variable global).

Q:

Facilidad de escritura para aplicaciones paralelas/concurrentes

p -> q

Reduction

Mecanismo para ejecutar programas funcionales. Proceso de convertir una expresión a una forma más simple. Ejemplo:

3+(5*(8-2))
-->Reduction
3+(5*6)
-->Reduction
3+30
-->
33
(3+4)*(15-9)
-->Reduction
7*(15-9)             | (3+4)*6
-->
7*6                  | 7*6
-->
42

Redex (Reducible expression)

Una expresión que coincide con el lado izquierdo de alguna regla de reducción o definición. Es cualquier expresión cuya evaluación requiere que se realice un trabajo.

Teorema de Church-Rosser:

Establece que, al aplicar las reglas de reducción a los términos , el orden en el que se eligen las reducciones no hace una diferencia en el resultado final.

Diferentes expresiones pueden ser evaluadas en paralelo, sin afectar el resultado.

Expresiones

Algunos dicen que:

Functional programming is programming with expressions.

Porque en todo usamos expresiones, una expresión es una serie de operaciones que dan como resultado un solo valor. 2+2 es una expresión que se evalúa al valor 4. Estad pueden contener llamadas a funciones.

Ecuaciones

Es tan simple definir su utilidad como:

Da nombre a valores Lado izquierdo = lado derecho

Espera, esto me suena a una variable, como en otros lenguajes, ¿es eso?

Nooooo...., en programación funcional no existen las variables

La reasignación no está permitida

Es más como una contante, una vez dado el valor a un nombre, no puedes cambiarlo nunca.

Funciones anónimas (lambdas)

Las funciones que no tienen nombre, son las funciones anónimas, también llamadas lambdas, muy útiles en Haskell, incluso probablemente las has utilizado con otros lenguajes, con el común map o filter:

numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x*x, numbers)
map (\x -> x*x) [1..5]

RECURSOS PARA APRENDER PROGRAMACIÓN FUNCIONAL

Cursos

Desafíos