Recurso | Link |
---|---|
Presentación | 👨🏫 |
Video | 📹 |
Una secuencia de operaciones a realizar. Especificamos la secuencia de operaciones utilizando condicionales o ciclos (if, for, while, etc.)
Algunos lenguajes imperativos:
Se especifica el resultado deseado, no cómo lograrlo.
Algunos ejemplos de lenguajes declarativos:
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.
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
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
Definición Matemática: regla que asigna a cada elemento de un primer conjunto un único elemento de un segundo conjunto.
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
- Función que toma un parámetro (name) y regresa un mensaje "Hello Daniel", por ejemplo.
def hello(name:str)->str:
return "Hello, "+name
- Función que suma dos números
def add(n1:int, n2:int)->int:
return n1+n2
- 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:
- Función que regresa un mensaje de Hello y un nombre que pase:
hello name = "Hello, "++name
- Función que suma dos números
add n1 n2 = n1+n2
- 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)
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
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
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.
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.
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.
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.
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]