1

Programación funcional

Hola Platzinauta. 👋
Te comparto mis apuntes para que #NuncaParesDeAprender. 👀✍
Programación funcional

Es un paradigma que usa funciones como “Ciudadanas de primera clase”. Puede crear funciones de orden superior. Prioriza el uso de recursividad y HOF para resolver problemas.

Una función puede recibir y dar salidas a otros datos como resultado, incluyendo a otras funciones. Se busca eliminar o reducir los efectos secundarios.

Origen

En los años 30, Alonzo Church desarrolla el cálculo Lambda. Alan Turing demuestra que este es el equivalente a las maquinas de Turing.

A finales de los 50, se desarrolla LISP, implementando la notación lambda de Church.

Dato curioso

La saga de video juegos Jack and Daxter, fueron desarrollados en GOAL (Game Oriented Assembly Lisp). Está basado en Lisp, fue desarrollado con programación netamente funcional.

(print"Hello, World!")
(defun factorial (n)
(if (= n 0) 1
(* n (factorial (- n 1)))))

Funciones

Relación entre dos conjuntos que asigna cada elemento del primero un elemento del segundo o ninguno.

En matemáticas una función es algo similar:

Un tipo de dato u objeto que toma un valor “X” y genera un valor “Y”

Puede o no devolver un resultado.

f(X) = X + 3

f(X) = X^2 + 3

Aquí tenemos el ejemplo de una función en python. Toma dos parámetros y nos va a retornar como resultado, la suma de ambos parámetros.

def suma (a, b)
return a + b
def suma (a, b): 
a + b
operacion_1 = suma(3, 2)

Ciudadanas de primera clase

Son reconocidas por el lenguaje, se utilizan como un tipo de dato y en cualquier parte del programa.

Funciones de orden superior

Es una función que puede:

  • Tomar una o más funciones como parámetro o;
  • Retornar una función como salida.

Funciones puras

  • Son determinísticas.
  • Un valor de entrada da un solo valor de salida.
  • No genera efectos secundarios.
  • No incluye funciones impuras.

Funciones lambda

  • Función anónima.
  • Comportamiento de uso único.
  • Contexto específico o corto tiempo.
  • Simplicidad.
<h1>Efectos secundarios</h1>

Es común escucharlo cuando hablamos de programación imperativa. Lo podemos ver cuando manejamos funciones o variables de contexto global o que están delimitadas. Ej: En JavaScript es muy importante tener un manejo del SCOPE (alcance de las variables)

Cuando escribimos código sabemos que lo que esta dentro de una función, no afecta a otra, si es que usamos la sintaxis correcta. Pero también existen funciones que utilicen parámetros o que tengan alcance global y puede tener efectos secundarios.

Forma en que alguien o algo se comporta ante un determinado estímulo.

Cambios observables

  • Estado de la aplicación.
  • Valores de datos.
  • Modificación de archivos, etc.
<h1>Lenguajes</h1>
  • LISP
  • SCHEME
  • CLOJURE
  • RACKET
  • ERLANG
  • HASKELL
  • F#

Como podemos ver, aquí está la función que se llama a sí misma y solamente modifica los parámetros cuando lo hace, como característica hay muchos paréntesis, pero es simplemente parte de la sintaxis.

(defun factorial (n)
(cond
((= n 0) 1)
((= n 1) 1)
(t (* n (factorial (- n 1 ))))))

Tenemos en Haskell donde calculamos el factorial de un número, en ejemplos anteriores habíamos podido ver como se define el tipo de dato, después se asignan los tipos de valores y se empieza a llamar a la función. Podemos ver que el código no es tan amplio como si lo hubiéramos escrito de forma no recursiva con otros lenguajes.

module Main whereimport Text.Printf

factorial :: Integer -> Integerfactorial0 = 1factorial n = n factorial (n - 1)

line x = printf "%d! = %d\n" x $
factorial x

main = mapM_ line [0..16]

Aquí también tenemos un ejemplo con F# que es un lenguaje funcional y vemos que también es recursivo porque la función factorial se está llamando a sí misma.

letrec factorial n = 
match n with
| 0 | 1 -> 1
| _ -> n * factorial(n-1)

Escribe tu comentario
+ 2