Sunteți pe pagina 1din 5

ASIGNATURA: PROGRAMACIÓN DECLARATIVA

TITULACIÓN: INGENIERÍA INFORMÁTICA

PROFESOR: JAVIER VERGARA IGUAL


Avenida Alcalde de Móstoles 33 (Posterior) 28922
TEMA: Móstoles (Madrid)

91 664 67 20 - 717 716 540


PROGRAMACIÓN FUNCIONAL
info@academia-atica.com www.academia-atica.com

INTRODUCCIÓN
Existen dos grandes Paradigmas de Programación:

• Paradigma de Programación Estructurada/Imperativa/Procedimental


• Paradigma de Programación Declarativa
El primero se basa en un conjunto de instrucciones ejecutadas de forma predefinida (ordenada)
cuyo objetivo es dar lugar a un algoritmo que resuelva un problema. El segundo se fundamenta en
plasmar los predicados o reglas que determinan el objetivo a conseguir, más que cómo se llega a
la resolución del problema.

Existen dos sub-tipos de programación dentro del Paradigma de Programación Declarativa:

• Programación funcional: basada en la definición de predicados o funciones (Haskell)


• Programación lógica: basada en la definición de relaciones lógicas o cláusulas (Prolog)

PROGRAMACIÓN FUNCIONAL

ENTRADA (D) FUNCIÓN SALIDA (R)

ENTRADA (D) FUNCIÓN SALIDA (R)

RECURSIVIDAD
1
• NO existe el concepto de paso de parámetro por referencia. Este hecho determina que ninguna
variable pasada como argumento puede modificar su valor.
• NO existen efectos laterales, ya que el concepto de variable global es inexistente.
• Las funciones son de orden superior, es decir, pueden ser pasadas como parámetro a otra
función, devueltas como resultado o incluso almacenadas en estructuras de datos.

LISTA

• La lista es la estructura de datos esencial para programar en Haskell.


• Haskell es un lenguaje fuertemente tipado, por lo que todo debe tener un tipo estricto y,
obviamente, no existen conversiones implícitas entre valores de distintos tipos. Sin embargo, sí
adopta la inferencia estática (compilación) de tipos.
• Los ficheros con el código fuente de Haskell tienen extensión “.hs” (haskellscript).

TIPOS
SIMPLES
• Bool
- Dominio: [False, True]
- Operadores: &&, ||, not
• Char
- Ej.: ’j’, ‘*’, ‘\n’, etcétera
- Operadores: ord, chr, isUpper, isDigit, toLower, toUpper, etcétera
- Nota: Es preciso importar el paquete “Data.Char” para utilizar las funciones especiales
anteriormente citadas
• Int & Integer (entero largo)
- Ej: 1, 684, -7, etcétera
- Operadores: +, -, *, `div`, `mod`, `rem`, abs, negate, even (par), odd (impar), etcétera
• Float & Double
- Ej.: 5.75, 5.75e7 (científica)
- Operadores: +, -, *, /, abs, truncate, round, floor, ceiling, etcétera
• String
- Ej.: “Julio Iglesias”, “Me va”, etcétera

Nota: Hay algunas cosas similares a PASCAL

COMPUESTOS
• Listas: [T]
• Tuplas: (T1, T2, …, Tn)
• Funciones (notación currificada)
2
OPERADORES DE COMPARACIÓN
• ==, /=, <, <=, >, >=

EXPRESIONES CONDICIONALES
• if - then - else
- Nota: La rama “else” es obligatoria
• case
- Nota: Admite no sólo variables, si no también expresiones
• guardas

LISTAS
Se pueden crear:

• Enumerando elementos
• Declarando expresiones
• Mediante abreviaturas
• Mediante el operador de adición “:” (asociativo por la derecha)

OPERADORES
• lista1 ++ lista2: concatenación binaria
• concat [lista1, lista2, lista3, …]: concatenación múltiple
• reverse lista: invierte los elementos de una lista
• length lista: devuelve el número de elementos de una lista
• head: lista: devuelve el elemento cabecera de la lista
• tail lista: devuelve el resto de la lista
• last lista: devuelve el último elemento de la lista
• init lista: devuelve todos los elementos de la lista salvo el último
• take n lista: devuelve una lista con los n primeros elementos
• drop n lista: devuelve una lista eliminando los n primeros elementos
• lista !! índice: devuelve el elemento que ocupa la posición “índice” de la lista
• zip lista1 lista2: devuelve una lista con las parejas de elementos (1 a 1) de ambas listas
• unzip lista_de_parejas: devuelve dos listas separando los elementos previamente
“comprimidos”

LISTAS POR COMPRENSIÓN

Permiten generar listas de forma concisa. Es una forma de crear listas a caballo entre la
declaración de expresiones y el uso de simplificaciones o abreviaturas.

[ expresión | cualificador1, cualificador2, cualificador3, …]

GENERADORES

[x * 2 | x <- [1..100]] => [2, 4, 6, …]


[(x, y) | x <- [1..3], y <- “Hi!”] => [(1,’H'),(1,'i'),(1,'!'),(2,'H'),(2,'i'),(2,'!'),(3,'H'),(3,'i'),(3,'!')] (Todas las
combinaciones posibles)

3
FILTROS

[x * 2 | x <- [1..100], even x] => [4, 8, …]

DECLARACIONES LOCALES (POSTERIORMENTE)

PATRONES O REGLAS
Se pueden emplear patrones o reglas para definir las funciones en lugar de utilizar expresiones
condicionales.

Ej:

f :: [Integer] -> Integer


f [1, x, y] = x + y

Danger! Danger!

• Patrones constantes
• Patrones para listas y tuplas
• Patrones aritméticos
• Patrones nombrados (identificador@expresión): simplificación en la parte derecha
• Patrón subrayado (_): es un identificador anónimo usado cuando un parámetro no tiene
relevancia en la parte de la derecha (para cualquier otra cosa)

DEFINICIONES LOCALES
En caso de que una expresión se repita varias veces, y ello conlleve su evaluación múltiple, se
pueden utilizar definiciones locales para ganar eficiencia o funciones auxiliares.

LET

let variable = valor in expresión

WHERE

expresión
where
variable = valor

FUNCIONES
• Recursividad
• Orden Superior
• Sobre listas:
• map f xs: devuelve la lista resultante de aplicar la función “f” a cada elemento de la
lista
4
• filter p xs: devuelve la lista resultante de filtrar los elementos que cumplen
determinada condición
• all p xs: determina si todos los elementos de la lista cumplen determinada propiedad
• any p xs: determina si algún elemento de la lista cumple determinada propiedad
• foldr operador elemento_inicial lista: devuelve un único valor resultado de utilizar
el operador “operador” entre cada uno de los elementos de la lista, empezando por el
final y usando el primer elemento como valor inicial. Ej: foldr (+) 0 [1, 2, 3, 4, 5] = 15
• foldl operador elemento_ inicial lista: su mecanismo es el mismo que la función
anterior pero actuando de izquierda a derecha
• Expresiones lambda
• Definen funciones anónimas a “pecho descubierto”
• Se pueden pasar como argumento de otras funciones
• Ej:
• (\x -> x + x) 2
• Funciones polimórficas (Tipo a, b, etcétera)

S-ar putea să vă placă și