La programación funcional es un paradigma declarativo que usa funciones como “ciudadanas de primera clase”. Las funciones (en programación) son fragmentos de código reutilizables, que pueden recibir datos y dar salidas a otros datos como resultado, incluyendo otras funciones. Mediante la programación funcional se busca eliminar o reducir los efectos secundarios.
En la programación funcional se pueden crear funciones de orden superior (HOF). Prioriza el uso de recursividad y HOF para resolver problemas.
Origen de la programación funcional
En los años 30, Alonzo Church desarrolló el cálculo Lambda. Alan Turing demostró que este es equivalente a las máquinas de Turing. A finales de los 50, se desarrolló LISP, implementando la notación lambda de Church. Aquí un ejemplo en LISP de cómo se ve un "hola mundo" y una función recursiva (que se llama a sí misma) donde se calcula el factorial de un número n.
(print"Hello, World!")(defunfactorial(n)(if(= n 0)1(* n (factorial(- n 1)))))
Funciones
En matemáticas, una función se define como una relación entre dos conjuntos que asigna cada elemento del primero, un elemento del segundo o ninguno.
Por ejemplo, una función que toma un valor “X” y genera un valor “Y”.
f(X)=X+3f(X)=X^2+3
Un ejemplo de funciones en Python es el siguiente. La función suma recibe dos números (a y b) y retorna la suma de los dos números. Aquí podemos ver que el concepto de función en matemáticas y en programación es parecido.
defsuma(a, b):return a + b
operacion_1 = suma(3,2)
Las funciones también pueden hacer uso de otras funciones, como en el siguiente ejemplo.
defes_par(x):returnnot es_impar(x)
Es más, las funciones pueden llamarse a sí mismas (recursión)
deffibonacci(n):if n<=1:return m
else:return fibonacci(n-1)+fibonacci(n-2)
Conceptos de la programación funcional
Al principio mencionamos conceptos como "ciudadanas de primera clase", funciones de orden superior y efectos secundarios. Definamos estos (y más) conceptos.
Funciones como ciudadanas de primera clase
El que las funciones sean ciudadanas de primera clase implica que son reconocidas como un tipo de dato más. Esto hace que se puedan usar en cualquier parte del programa.
Funciones de orden superior
Una función de orden superior puede recibir una o varias funciones como parámetro. Además, puede retornar otra función.
Funciones puras
Una función es pura si cumple con los siguientes requisitos.
Es determinista: para un parámetro, la función siempre va a retornar el mismo resultado siempre y cuando no se cambie dicho parámetro (por ejemplo, una función que retorne un valor aleatorio no es determinista).
Un valor de entrada da un solo valor de salida.
No genera efectos secundarios.
No incluye funciones impuras.
Funciones lambda
Una función lambda es una función anónima, es decir, que no se le asigna un nombre. Normalmente, se usan en una única sección del código. Por lo general realizan operaciones simples.
Un ejemplo de una función lambda que multiplica dos números en Python:
x =lambda a, b: a**b
print(x(3,3))
Efectos secundarios (side effects)
Es común escuchar de efectos secundarios cuando hablamos de programación imperativa. Lo podemos ver cuando manejamos funciones o variables de contexto global o que están delimitadas. Cuando escribimos código sabemos que lo que está dentro de una función, no afecta a otra, si es que usamos la sintaxis correcta. Pero también existen funciones que usan parámetros o que tienen alcance global y pueden tener efectos secundarios.
Los efectos secundarios son cambios observables en partes de un programa como:
El estado de la aplicación.
Valores de datos.
Modificación de archivos.
Lenguajes y ejemplos
Este es un ejemplo 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.
Otros lenguajes funcionales son SCHEME, CLOJURE, RACKET y ERLANG.
Conclusión
La programación funcional nos permite escribir código especificando qué queremos hacer más que cómo se debe hacer. A su vez, nos permite evitar efectos secundarios. Es importante entender conceptos como funciones de orden superior, recursividad o funciones puras para poder hacer un buen uso de la programación funcional.
Contribución creada por: Ciro Villafraz con los aportes de Iris Valentina.
functionPura(a){return a *2}Pura(2)// Resultado: 4
Recibe un parámetro y retorna un único valor, además con antelación puedo saber cuál será el resultado
Funciones ImPuras:
functionImPura(){returnMath.random()}ImPura()// Número decimal aleatorio entre 0 - 1
No recibe ningún parámetro y aunque lo recibiera, no puedo predecir el resultado de la función
Funciones Lambda:
((n)=>{return"La mitad de "+n+" es: "+ n/2})(8);// Resultado: "La mitad de 8 es: 4"
Es una función anónima que igual recibe un parámetro y retorna un único valor.
Funciones de orden superior:
functionOrdenSuperior(funcionRecibida){funcionRecibida();returnfunction(){console.log("Hola soy la función retornada")}}constResultado=OrdenSuperior(()=>{console.log("Hola soy la función enviada como parámetro")})// Resultado: "Hola soy la función enviada como parámetro"Resultado()// Resultado de llamar la función retornada: "Hola soy la función retornada"
Muy bien explicado y con código
Exclente!!
Les comparto mis apuntes, espero les sea de mucha mucha ayuda para que #NuncaParenDe Aprender
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!")(defunfactorial(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:
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!")(defunfactorial(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.
defsuma(a, b)return a + b
defsuma(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.
Efectos secundarios
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.
Lenguajes
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.
(defunfactorial(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.
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)
Felicitaciones excelente resumen, gracias por compartir
:clap: :clap: :clap: :clap: :clap:
Woow, todo esto fue lo que me preguntaron en mi primera entrevista técnica para ser software engineer en México. Fue tipo así
-Qué es una clase?
Es la definicón de un objeto :)
-y qué es un objeto?
Es una instancia de una clase, es como si una clase fuera un cortador de galleta y el objeto es una galleta
-y qué es una instancia?
Los objetos se almacenan en memoria y la instancia es el espacio que hace referencia a ellos
-muy bien, ahora cuentame qué es el polimorfismo?
-............
-no te preocupes, dime qué es el encapsulamiento?
-el encapsulamiento permite limitar ? los métodos de un objeto?
-ok... y qué es lamnda?
-...una letra griega :v
Estudie informatica y me sentia super confiada, la verdad con estas clases y las entrevistas ténicas me doy cuenta del gap mental que tenia entre cada concepto.
que edad tenias cuando paso eso? xd
Y yo que pensé que con solo demostrar que dominas en cierto porcentaje algunos lenguajes de programación pasaría las entrevistas tranquilamente!
Viendo todo el contenido de este curso y con tu comentario veo que aun desconozco muchas cosas y que aún me falta mucho para poder postularme a un puesto de trabajo!
¡A seguir aprendiendo!
Una función impura puede ser las operaciones matemáticas: según el número que le demos va a retornar un resultado diferente. Otra podría ser solicitar la edad de una persona. Como lo entiendo yo, la función impura es cualquier función donde el dato de salida depende del dato de entrada. Si cambia el dato de entrada, cambia el dato de salida. En las puras los datos podrían llamarse también constantes, pues no cambian. Por ejemplo, solicitamos el valor de pi. Es siempre el mismo valor.
Recordemos que hay funciones matemáticas que son puras como una ecuación lineal. Sin embargo una función cuadrática es impura ya que puede tener dos valores de saldia en Y por cada valor en X.
Profesor, creo que estás teniendo una confusión entre función impura e inyectiva. Las funciones cuadráticas son funciones también, si para un mismo valor de x pudiera tener más de una y, no sería una función. La aclaración que hacer en las funciones cuadráticas es que, para un mismo valor de y, puede haber más de un valor x que la produjo. Esto hace que no sea una función inyectiva.
++Programación funcional++
Se basa en las funciones
Prioriza la recursividad y funciones de orden superior
Se busca eliminar o reducir efectos secundarios
Origen en los 30 a nivel de teoría
Finales de los 50 con LISP
Algunos logos de los lenguajes más famosos suelen tener el simbolo de lambda
Una función es una relación entre dos conjuntos que asigna a cada elemento del primero uno o ninguno del segundo o ninguno
++Ciudadanas de primera clase++
En estos lenguajes las funciones se tratan como un tipo de dato más y se pueden llamar desde cualquier parte del programa
++Funciones de orden superior++
pueden tomar una o más funciones como parámetro y 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
De los lenguajes mencionados solo reconozco a F# (F Sharp), ¿Alguién lo llego a utilizar?
F# es utilizado principalmente en aplicaciones científicas y financieras, pues su fuerte está en la programación orientada a los datos, programación paralela y desarrollo algorítmico.
Las funciones lambda me hacen pensar remotamente en las funciones delta de dirac, que (según la wikipedia) podrian entenderse como una función igual a cero en todas partes excepto en un punto y cuya integral sobre toda la línea real es igual a uno.
🤔 La programación funcional tiene como pilar fundamental la inmutabilidad.
Como lo veo: Una función es un bloque de código que hace algo especifico, y puede ser llamado desde diferentes puntos del programa.
que interesante curso. Voy a verlo varias veces y tomar notas
Lo mismo he hecho bro muy buena información.
¿Las funciones ciudadanas de primera clase vendrían siendo las "built-in functions"? 🤔
Creo que no, más bien esas podrían ser las funciones puras, aunque si te soy sincero no estoy muy seguro
Me parece que no del todo. Cuando menciona que las funciones son reconocidas como un tipo de dato, se refiere a toda clase de funciones. Incluyendo no sólo a las built-in functions, sino que a todas las funciones que podamos crear nosotros o se encuentren en librerías que estemos utilizando.
La programación funcional es una forma de entender nuestro software como una serie de funciones matemáticas en las que, dadas unas entradas determinadas, siempre obtenemos las mismas salidas.
Una funcion impura podria ser aquella que retorna valores aleatorios como lo es Math.random() en Js.
Tambien lo podrian ser aquellas que requieren recursos externos de los que no podriamos tener pleno control. Una función que acceda a una url para descargar datos, por ejemplo. Estos datos pueden variar cada segundo o el servidor puede estar caido y la funcion devolveria un error o un dato vacio
Gracias
Entendemos por programación funcional un lenguaje de programación declarativo donde el programador especifica lo que quiere hacer, en lugar de lidiar con el estado de los objetos. Es decir, las funciones estarían en un primer lugar y nos centraremos en expresiones que pueden ser asignadas a cualquier variable.
Que interesante que ha sido este curso hasta ahora.
Me alegra saber que lo estés disfrutando :D
wooo mi cabezaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
x2
La programación funcional nos es más que un paradigma de programación, es decir, es una forma en la cual podemos resolver diferentes problemáticas.
Cuando nos encontramos desarrollamos software utilizando este paradigma, estaremos trabajando principalmente con funciones, evitaremos los datos mutables, así como el hecho de compartir estados entre funciones.
Con este paradigma las funciones serán tratadas como ciudadanos de primera clase. Las funciones podrán ser asignadas a variables además podrán ser utilizadas como entrada y salida de otras funciones.
A las funciones que puedan tomar funciones como parámetros y devolver funciones como resultado serán conocidas como función de orden superior.
La programación funcional es un paradigma declarativo. Nos enfocaremos en "qué" estamos haciendo y no en "cómo" se está haciendo que sería el enfoque imperativo. Esto quiere decir que nosotros expresaremos nuestra lógica sin describir controles de flujo; no usaremos ciclos o condicionales.
Veamos un ejemplo utilizando Java.
Java, cómo sabemos es un lenguaje orientado a objetos, sin embargo, en versiones recientes nosotros podemos hacer uso de la programación funcional.
En este ejemplo, la problemática es conocer la cantidad de elementos en la lista mayores a 10.
Hay un error en el concepto de "función pura" y la función cuadrática.
El profesor dice "por cada valor de entrada va a haber un solo valor de salida". Esto en matemáticas aplica para la definición de función en sí misma. Si una función recibe una entrada, retorna una única salida, si no, no es función. Gráficamente se puede apreciar esto si se busca en internet: criterio de la recta vertical.
Dentro del mundo de la programación las funciones puras cumplen con o que el profesor dice, pero en el mundo de las matemáticas tanto la función lineal como la función cuadrática retornan un solo valor para una entrada específica, de lo contrario no serían funciones.
Posiblemente haya una confusión con el concepto en matemáticas de función inyectiva que es una función que para un valor retornado Y hay un único valor de entrada X (para una imagen dada hay una única preimagen), lo cual no es lo mismo que decir que para una entrada X hay una única salida Y (definición de función).
Un ejemplo gráfico de función inyectiva se puede encontrar si se busca en internet: criterio de la recta horizontal.