2. Conceptos subyacentes a la programación
funcional, así como características que la
hacen un enfoque particular y novedoso de la
programación y que la convierten en una
opción frente al enfoque imperativo
convencional en el área del desarrollo de
software.
3. Un paradigma de programación indica un
método de realizar cómputos y la manera en
que se deben estructurar y organizar las tareas
que debe llevar a cabo un programa. Los
paradigmas fundamentales están asociados a
determinados modelos de cómputo. También
se asocian a un determinado estilo de
programación. Los lenguajes de programación
suelen implementar, a menudo de forma
parcial, varios paradigmas.
Introducción.
4. Introducción.
Un lenguaje de programación es un lenguaje
artificial diseñado para expresar cómputos que
pueden ser llevados a cabo por una máquina:
• Basado en un modelo de cómputo (que
puede o no coincidir con el de la máquina
en que se va a ejecutar.)
• Definido a un nivel de abstracción más
elevado (más cercano al programador.)
• Traducible a un código que pueda entender
el procesador: el código máquina.
13. Introducción.
• CPLBCPL B C C++ Java
• CPL (Combined Programming Language):
1960, basado en ALGOL 60.
• BCPL (Basic Combined Programming
Language ): Martin Richards, 1966.
• B: Ken Thompson y Dennis Ritchie,
reemplazado por C (1969).
14. Introducción.
• C: Bell Telephone Laboratories (1972)
por Dennis Ritchie para usarlo con
Unix
• Propósito general,
• Estructurado por bloques,
• Imperativo,
• Procedimientos
15. Introducción. C++:
Bjarne Stroustrup (1979) Bell Labs.
Mejora a C: “C con clases”. C++ in
1983.
Mejoras en adición de clases, funciones
virtuales, sobrecarga de operadores,
herencia múltiple, plantillas y manejo de
excepciones.
C++ ratificado como estándar en 1998
como ISO/IEC 14882:1998, 2003,
ISO/IEC 14882:2003.
16. Introducción.
Java
Sun Microsystems (1995)
Sintaxis deriva de C y C++.
Orientado a Objetos.
Compilado a bytecode. Ejecutado
sobre cualquier Java virtual machine
(JVM). Sobre cualquier arquitectura.
Sun desarrolla e implementa
compiladores, máquinas virtuales y
librería de clases.
17. Introducción.A-0
FORTRAN
Mark I
Autocode
FLOW-MATIC General Problem
SolverFORTRAN II
FORTRAN IV
ALGOL/
ALGOL58
ALGOL60
JOSS
FORTRAN 66
ALGOL68
FORTRAN 77
PL/1
PL/C
FACT
COMTRA
N
COBOL
SNOBOL
BASIC
SNOBOL 4 MUMPS COWSEL
POP-1
POP-2
PILOT
INTERCAL
ML
Prolo
g
MercuryBourn
e
Shell
DBase
DBase-
II
DBase-III
DBase-IV
dBase
5.0
VULCAN
BETA
Occa
m
Occam
2
Clippe
r
Foxpro
PARADOX
COMAL
GRASS
Altair
BASIC
Gambas
VisualBasi
c
VB Script
Ada
95
Pascal
Concurrent
Pascal
Ada
Turbo
Pascal
Green
Ada
83ICON
MODUL
A
MODULA-2
FORTRAN
90
MODULA-3
Oberon
Oberon2
TurboPascal
OOP
Borland
Pascal
ComponentPascal
Delphi
ELAN
APL
CPL
BCPL
B
B BPL
C
D
Unix-
Shell
sh
csh
ksh
bash
awk
Ratfor
nawk
gawkPer
l
REX
X
PHP
PHP/F
1
Perl 5
Tcl
J FL K
NGLS2
Coyot
e
Smalltalk-80
Smalltalk-72
Objective C
C++
ANSI C
ISO C90
Miranda
Haskell
MetaHaskel
l
ISO C95
ISO C99
C#
Nemerle
ECMAScript
JavaScript
LiveScript
Java Self
Pike
FP
LPC
Joy
Factor
Simul
a OOP
PostScript
SIMULA
Simula-67
Forth
Schem
e
LISP
Logo
Common LispTRAC
19. Los paradigmas fundamentales están basados
en diferentes modelos de cómputo y por lo
tanto afectan las construcciones más básicas
de un programa.
La división principal reside en el enfoque
imperativo (indicar el cómo se debe calcular) y
el enfoque declarativo (indicar el qué se debe
calcular).
El enfoque declarativo tiene varias ramas: el
paradigma funcional, el paradigma lógico, la
programación reactiva y los lenguajes
descriptivos.
Introducción.
20. • Describe la programación como una
secuencia instrucciones o comandos que
cambian el estado de un programa.
• El código máquina en general está basado
en el paradigma imperativo.
• Su contrario es el paradigma declarativo e
incluye el paradigma procedimental
(procedural) entre otros.
Introducción: Modelo Imperativo
21. Paradigma orientado a objetos.
La idea es encapsular estado y operaciones
en objetos. En general, POO se resuelve
comunicando objetos a través de mensajes
(programación orientada a mensajes.) Dentro
de este paradigma, no formalmente, se
incluye el basado en objetos, que además
posee herencia y subtipos entre objetos.
(Simula, Smalltalk, C++, Java, Visual Basic
.NET, etc.) Su ventaja es la reutilización de
códigos y su facilidad para pensar soluciones
a determinados problemas.
22. • No se basa en el cómo se hace algo (cómo
se logra un objetivo paso a paso), sino que
describe (declara) cómo es algo.
• Es decir, describe las propiedades de la
solución buscada, dejando indeterminado el
algoritmo (conjunto de instrucciones) usado
para encontrar esa solución.
• Es más complicado de implementar que el
paradigma imperativo, tiene desventajas en
la eficiencia, pero ventajas en la solución
de determinados problemas.
Introducción: Modelo Declarativo
23. • Usa bloques de construcción como las
funciones, la recursión o la equipación de
patrones, para especificar más la solución
que su cálculo de bajo nivel.
• Tipos:
• Lenguajes funcionales.
• Lenguajes lógicos.
Introducción: Programación Declarativa
25. El estilo de programación imperativa (es decir,
la programación a través de acciones que
modifican el estado del computador) ha
dominado el panorama de la programación
desde sus inicios, por que los lenguajes
imperativos son más cercanos a la forma como
realmente funciona la máquina. Existen otros
paradigmas de programación diferentes al
imperativo como la programación funcional y la
programación lógica. La programación
funcional, es casi tan antigua como la
imperativa.
Introducción.
26. La programación funcional es una importante
opción para el desarrollo de software ya que
facilita la reusabilidad, la modularidad, la
mantenibilidad y la corrección.
Introducción.
28. Modelos de cómputo.
El concepto de cómputo puede modelarse por
el concepto matemático de función:
“Aplicación de un dominio de valores a un
rango de resultados donde cada valor puede
estar asociado como máximo a un resultado”
Modelos formales son:
• Funciones parciales recursivas.
• Cálculo lambda / Lógica combinatoria.
• Lógica de predicados + unificación.
• Sistemas de reescritura.
29. Paradigma lógico.
Se basa en la definición de reglas lógicas
para luego, a través de un motor de
inferencias lógicas, responder preguntas
planteadas al sistema y así resolver los
problemas. Ejemplo: Prolog.
30. “La programación funcional es un
paradigma de programación declarativa
basado en el uso de funciones puras, sin
efectos secundarios.”
¿Qué es la programación
funcional?
31.
32. ¿Qué es la programación
funcional?
En términos simples…
Utilizar funciones que lo único que hacen es
procesar los datos de entrada y retornar el
resultado.
Siempre que la entrada sea la misma, el
resultado también lo será.
33. “Es el estilo de programación que enfatiza la
evaluación de expresiones, antes que la
ejecución de comandos.”
¿Qué es la programación
funcional?
Una programa funcional está constituido
enteramente por funciones; el programa
principal es una función que toma como
argumento la entrada al programa y genera la
salida del programa como su resultado.
34. ¿Qué es la programación
funcional?
Típicamente, la función principal se define en
términos de otras funciones, y éstas, a su vez,
en término de más funciones; esta cadena
finaliza en funciones predefinidas o primitivas.
La principal diferencia es que los únicos
elementos constructores son la definición y la
aplicación de funciones, pero en los
programas imperativos se utilizan, además,
variables, asignaciones ciclos, etc.
35. ¿Qué es la programación
funcional?
Parece muy restrictivo no poder utilizar
variables, ni asignaciones, ni ciclos; sin
embargo se ha demostrado matemáticamente
que la definición y la aplicación de funciones
es suficiente para construir cualquier función
computable.
36.
37. Programación Funcional
• Usa funciones libres de efectos secundarios
como bloques primitivos de construcción de
programas.
• Estas funciones pueden aplicarse,
construirse y pasarse como argumento a
otras funciones.
• Concibe a la computación como la
evaluación de funciones matemáticas y
evita declarar y cambiar datos.
38. Programación Funcional
• Hace hincapié en la aplicación de las
funciones y composición entre ellas, más
que en los cambios de estados y la
ejecución secuencial de comandos (como
lo hace el paradigma procedimental.)
• Permite resolver ciertos problemas de
forma elegante y los lenguajes puramente
funcionales evitan los efectos secundarios
comunes en otro tipo de programaciones.
39. ¿Cuál es el poder de la P.F?
Depende de varias características que poseen
los lenguajes funcionales; entre ellas: el
manejo de funciones de alto orden, la
declaración de tipos algebraicos, la inferencia
de tipos, el emparejamiento de patrones y el
manejo automático de la memoria dinámica.
40. Funciones de alto orden.
“Alto orden" se refiere a funciones que reciben
como argumento o retoman funciones, es
decir, las funciones pueden manipulase como
datos; esta característica también es referida
como "funciones como objetos de primera
clase."
41. Potencial de los lenguajes
funcionales.
Transparencia referencial: Propiedad de los
lenguajes funcionales que hace que la misma
expresión siempre represente el mismo valor;
esto permite probar matemáticamente la
corrección de un programa.
42. Potencial de los lenguajes
funcionales.
Fundamentación matemática: El cálculo
Lambda, la lógica combinatoria, las teorías de
tipos, los sistemas de reescritura, la teoría de
dominios y la teoría de categorías son algunas
de las áreas de la matemática que la
fundamentan.
43. Potencial de los lenguajes
funcionales.
Eficiencia de compiladores e intérpretes: Los
avances investigativos han permitido la
construcción de compiladores que generan
código nativo que iguala en eficiencia el
código generado por compiladores
convencionales.
44. Potencial de los lenguajes
funcionales.
Paralelismo Implícito: El hecho que los
lenguajes funcionales (puros) no permitan
efectos laterales ni el uso de variables
globales, hace que la evaluación de diferentes
expresiones constituyan procesos
independientes y que pueden ser ejecutados
de manera simultánea.
45. Potencial de los lenguajes
funcionales.
Paralelismo Implícito: Esta característica
puede ser explotada para programar
computadores paralelos de manera natural
algo que no se ha logrado de manera
satisfactoria a través de la programación
convencional.
46. Programación Lógica.
• Basada en la lógica de predicados de primer
orden.
• Los programas se componen de hechos,
predicados y relaciones.
• Evaluación basada en resolución:
Unificación + backtracking.
• La ejecución consiste en la resolución de un
problema de decisión, los resultados se
obtienen mediante la instanciación de las
variables libres.
• Lenguaje representativo: PROLOG
48. Para tener una idea de la creciente comunidad
que usa Python, puede visitar y explorar
https://www.python.org/community
49. Programar es el arte de hacer que cualquier
dispositivo inteligente ejecute las instrucciones
que se les suministra en un idioma que el
dispositivo pueda entender y que el dispositivo
interpreta literalmente.
Cada lenguaje de programación posee una
forma propia que le permite al programador
darle instrucciones básicas a ese dispositivo
inteligente.
50. Python posee una simplicidad intuitiva tal, que
con unas pocas líneas de instrucción podemos
ejecutar actividades complejas que en otro
lenguaje requerirían muchas más líneas de
código o mayor número de instrucciones.
Lenguajes de programación con tal facilidad se
denominan de alto nivel.
Introducción.
51. Python no es un lenguaje funcional puro, sin
embargo incorpora esta característica.
Entiende el concepto de función según su
definición matemática y no como simples
subprogramas de los lenguajes imperativos.
Introducción.
52. Python fue diseñado a finales de la década de
los ochenta por Guido van Rossum. Un
lenguaje de programación de muy alto nivel,
con una sintaxis muy clara y una apuesta firme
por la legibilidad del código. Sin duda muy
versátil, fuertemente tipado, imperativo y
orientado a objetos, aunque contiene también
características que lo convierten en un
lenguaje de paradigma funcional.
Introducción.
53. Python se puede considerar un lenguaje semi-
interpretado. A diferencia de C, su código no se
ejecuta directamente en la máquina destino,
sino que es ejecutado por un SW intermedio (o
intérprete). Sin embargo, al igual que JAVA,
compila el código escrito en lenguaje de alto
nivel para obtener un seudo código máquina
(bytecode) que es el que propiamente ejecuta
el intérprete.
Introducción.
54. Obteniendo, instalando y
probando la
infraestructura computacional
necesaria para
Programar.
Para instalar una determinada versión se
aconseja recurrir a su sitioweb oficial.
python.org/downloads/release/python-
55.
56.
57.
58.
59.
60.
61.
62.
63. Obtenido el paquete
para el SO y versión
adecuados, en una
línea de comandos se
ejecuta el intérprete de
Python, y se prueba que
todo funciona
correctamente mediante
el clásico:
>>> print "Hola mundo"
Hola mundo
>>> quit()
>>>
64. Al iniciarse, después de imprimir la información
de versiones, Python muestra el símbolo “>>>”
para indicar que el intérprete está esperando
comandos. En este ejemplo pedimos que
imprima la cadena de caracteres “Hola
mundo”, y después de ver el resultado, se sale
de Python mediante la instrucción quit()
Por tanto puede considerar que tiene la
instalación básica de Python lista para su uso.
Pruebas y configuraciones.
65. Los tipos básicos de este lenguaje son
esencialmente los ya conocidos en cualquier
lenguaje de programación: los valores
numéricos, las cadenas de texto y los valores
booleanos.
Variables.
66. >>> # Ejemplos de variables
>>> a =42; # valor entero
>>> along = 42L ;
>>> ahex = 0x2a ;
>>> aoctal = 052;
>>> b = 3.1416; # valor en coma flotante
>>> bnotacion = 3.14e0 ;
>>> c = " Ejemplo de cadena de caracteres "
#Una cadena de caracteres
>>> #Imprimir las variables por pantalla
>>> print a , b , c;
42 3.1416 Ejemplo de cadena de caracteres
Variables.
67. >>> # tipo de las variables
>>> type (a) ;
<type 'int'>
>>> type (b) ;
<type 'float'>
>>> type (c) ;
<type 'str'>
>>>
Variables.
68. Los números enteros se pueden representar
en notación decimal, octal (anteponiendo un
“0” al valor) o hexadecimal (anteponiendo “0x”
al valor). Al igual que en lenguaje C (en el que
está escrito Python), los números se pueden
representar mediante enteros (por defecto) o
long (entero largo), que permite un rango
mayor de valores posibles. Este rango, de
nuevo como en C, dependerá de la plataforma
subyacente, pudiendo ser de 32 o 64 bits.
Variables.
69. Los valores flotantes son implementados a
bajo nivel directamente con el tipo double de C
(registro de 64 bits). Por su parte, los números
complejos están soportados de base y en la
práctica se implementan mediante dos
flotantes, uno para la parte real y otro para la
parte imaginaria.
Variables.
70. Python tiene de extensiones para más
operaciones en el módulo math. El valor de
retorno de un operador es determinado por el
tipo de las variables que intervienen en la
operación.
Operadores.Operadores.
71. Sí, por ejemplo, sumara dos números enteros,
nos devolverá otro valor entero. Si uno de los
dos operandos está en punto flotante, el
resultado de la operación será un valor en
punto flotante. El tipo básico booleano puede
recibir true or false, y se utilizan
fundamentalmente para expresar el resultado
de condiciones, especialmente útiles en los
bucles y control de flujo condicional.
Operadores.
73. Son fragmentos de texto delimitados por
comillas simples (’Un ejemplo’) o dobles (“Otro
ejemplo”). Para introducir saltos de línea,
dispone del carácter de escape ’ n’. También
puede usar otros caracteres de escape como
’t’ (tabulación) o ’b’ (borrar carácter). Para
conseguir que el texto se imprima tal y como
aparece en el código fuente sin tener que
recurrir a los códigos de escape, puede
delimitarlo por triples comillas.
Cadenas de caracteres.
74. # Ejemplos de cadenas
a = "holan"
b = "t Este es un ejemppblo de cadenas de
caracteresn"
c = """Es posible escribir saltos de linea
sin necesidad de códigos de escape. """
print a, b, c
Cadenas de caracteres.
76. Algunos operadores usados con valores
numéricos se encuentran sobrecargados en el
caso de las cadenas de caracteres. Ejemplo,
la igualdad (que asigna una cadena a una
variable) y el operador suma “+”. La suma de
dos cadenas es el resultado de concatenar la
segunda detrás de la primera. Del mismo
modo, el producto de una cadena por un
escalar da por resultado la misma cadena
repetida tantas veces como indique el
operador numérico.
Cadenas de caracteres.
77. Una función muy útil es str, que permite
realizar la conversión de valores numéricos a
cadena de caracteres. Si teclea str(8.987) en
la línea de comandos, obtendrá la salida
’8.987’:
>>> str(8.987)
'8.987'
>>>
Cadenas de caracteres.