You are on page 1of 27

Facilitador:Ing. Yadira Vargas M.Sw.E.

Correo electrnico yadira.vargas@utp.ac.pa


Telfono 560-3308

Ambientes de Programacin
Paradigmas de
Programacin

Programacin Declarativa

Paradigma Funcional
Paradigma Lgico

Programacin Imperativa

Paradigma Imperativo
Paradigma Orientado a Objetos
Paradigma dirigido por Eventos
Paradigma Concurrente

Un Poco de Historia
30s Alonzo Church:
Desarroll el Clculo de
Lambda

1970s, John Backus


desarroll FP
(Functional
Programming),

50s John McCarthy


Desarroll Lisp

60s, Peter Landin


Desarroll ISWIM (If you
See What I Mean),

1970s, Robin
Milner y otros
desarrollaron
ML (MetaLanguage),

Paradigma funcional
Los programas son expresiones y el nico constructor
sintctico utilizado es la aplicacin de una funcin a sus
argumentos
Las computaciones son realizadas
evaluando
expresiones puras

Haskel
Lisp
Scheme
Gopher
Miranda

Paradigma
funcional

El modelo funcional, tiene como


objetivo la utilizacin de funciones
matemticas puras sin efectos.
El esquema del modelo funcional
es similar al de una calculadora. Se
establece una sesin interactiva
entre sistema y usuario: el usuario
introduce una expresin inicial y el
sistema la evala mediante un
proceso de reduccin.
En este procesos se utilizan las
definiciones de funciones realizadas
por el programador hasta obtener un
valor no reducible.

Paradigma Funcional vs
Imperativo

Paradigma funcional
Programacin Funcional es un estilo de programacin en

el cual el mtodo primario de computacin es la aplicacin


de funciones a los argumentos

Funcin
Una funcin es un mapeo que toma uno o ms

argumentos y produce un nico resultado, y se define


usando una ecuacin dada por:
un nombre para la funcin,
el nombre de cada uno de sus argumentos,
y un cuerpo que especifica cmo el resultado se puede
calcular en funcin de los argumentos.

circunferencia r = 2 * pi * r

Funciones

El valor que devuelve una funcin est nicamente


determinado por el valor de sus argumentos consiguiendo
que una misma expresin tenga siempre el mismo valor.
Es ms sencillo demostrar la correccin de los
programas ya que se cumplen propiedades matemticas
tradicionales como la propiedad conmutativa, asociativa,
etc.

Transparencia Referencial

Name: = ++ getLine

Tampoco existen sentencias


imperativas y todas las funciones
tienen transparencia referencial
Una funcin tiene transparencia
referencial si su resultado
depende nica y exclusivamente
de los parmetros provistos, y no
produce efectos colaterales.
Los efectos colaterales son
cualquier cambio en el estado del
sistema

Recursividad
En este modelo el resultado de un
clculo es la entrada del siguiente
y as sucesivamente hasta que la
composicin produce el resultado
deseado
Factorial n = if n == 0 then 1 else n * fac (n-1)
Factorial n = product [1..n]
basada en el principio matemtico de induccin, que se ve
expresada en el uso de tipos de datos recursivos, como las
listas, y funciones recursivas que las operan.

Funciones de Orden Superior


Un lenguaje utiliza funciones de orden
superior cuando permite que las funciones
sean tratadas como valores de 1 clase,
permitiendo que sean almacenadas en
estructuras de datos, que sean pasadas como
argumentos de funciones y que sean
devueltas como resultados.
La utilizacin de funciones de orden
superior proporciona una mayor flexibilidad
al programador, siendo una de las
caractersticas mas sobresalientes de los
lenguajes funcionales.

Funciones de Orden Superior


Una funcin de orden superior es una funcin que toma
otras funciones como argumentos o devuelve una funcin
como resultado.
filter (isAlpha) "$#!+abcDEF657"
Salida: "abcDEF"

Inferencia de Tipos
Muchos lenguajes funcionales han adoptado un sistema
de inferencia de tipos
Consiste en que el sistema contiene un mecanismo que
infiere el tipo de dato de las expresiones, por lo que no es
obligatoria la declaracin el prototipo de las funciones.
Cuando el programador declara el tipo de alguna
expresin, el sistema verifica que el tipo declarado
coincide con el tipo inferido
Es un arma de doble filo, es una buena practica declarar la
signature o firma de la funcin
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

Polimorfismo
Los sistemas de inferencia de tipos aumentan su flexibilidad mediante
la utilizacin de polimorfismo, que permite que el tipo de una funcin
dependa de un parmetro.

zip "ABCD" [1,6,3,23,12]


[('A', 1), ('B', 6), ('C', 3), ('D', 23)]
zip [1,6,3,23] [A,B,C,D]

[(1, 'A'), (6, 'B'), (3, 'C'), (23, 'D')]

Currificacin
Currificacin:
es
descomposicin de
mltiples argumentos
encadenada de las
argumento

Haskell Curry

el proceso de
una funcin de
en una secuencia
funciones de un

-- Antes de la evaluacin:
Primeros5 = take 5 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
-- take se evala con el argumento 5, y el valor
resultante se aplica a la lista:
(take 5) [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
-- el resultado de aplicar(take 5) a la lista es:
[1,3,5,7]

Evaluacin Parcial
Hemos visto que cuando se llama a una funcin con slo
algunos de sus argumentos, se obtiene otra funcin de
regreso. A esto se le denomina Evaluacin Parcial
take5 = take 5

Usted puede hacer esto con cualquier funcin que toma varios
argumentos, lo que hace que la evaluacin parcial una
herramienta de gran alcance

Concordancia de Patrones
Es una forma simple e intuitiva de definir una funcin
Negacion :: Bool -> Bool
Negacion False = True
Negacion True = False

suerte :: Int -> String


suerte 7 = "SUERTE NUMERO 7!"
suerte x = "Lo siento, no tienes suerte!"
fac :: Integer -> Integer fac n
| n == 0 = 1
| n /= 0 = n * fac (n-1)

Evaluacin Perezosa
Solo evaluar un argumento de una funcin si ese argumento
es necesario para calcular el resultado global.
Si un argumento es estructurado(una lista o tupla, por
ejemplo), solo aquellas partes del argumento que son
necesarias sern examinadas
Square x= x* x

Square (1+2)
(1+2)*(1+2)
3*(1+2)
3*3
9

Algunas
Funciones
de Haskell

any (>5) [0,1,2,3,4,5]

Salida: False

elem 1 [1,2,3,4,5]

Salida True

lcm 4 9

Salida 36

cos (pi/2)

Salida 0.0

3 `quot` 12

Salida: 0

break (3==) [1,2,3,4,5]

Salida ([1,2],[3,4,5])

product [6,6]

Salida 36

Input: compare 2 4

Salida: LT

Input: replicate 3 5

Salida: [5,5,5]

filter (>5) [1,2,3,4,5,6,7,8]

Salida: [6,7,8]

Input: zip [1,2,3] [9,8,7]

Salida: [(1,9),(2,8),(3,7)]

main = do x <- getLine putStr x


Introducido

Salida: Texto

ZipWith (+) [1,2,3] [3,2,1]

Salida: [4,4,4]

Paradigma Funcional vs
Imperativo
Int suma (int n, int lista []) {
Int total = 0;
For (int i = 0; i< n; ++i)
Total += lista[i];
}

Suma [] = 0
Suma (x:xs) = x + suma xs

Ecuaciones

[] lista vacia
: cons una lista
Asignacin de
Variables

Ejecucin
Secuencia en C
i=1
total = 1
i=2
total = 3
i=3
total = 6
i=4
total = 10
i=5
total = 15

Aplicando Funciones
sum [ 1,2,3,4,5]
= { aplicar sum }
1 + sum [ 2,3,4,5]
= {aplicar sum }
1 + ( 2 + sum [ 3,4,5] )
= {aplicar sum }
1 + ( 2 + ( 3 + sum [4,5] )
= {aplicar sum }

= {aplicar + }
15

Ejemplo

media ns = sum ns `div` length ns

Ejemplo

palindromo xs = reverse xs

Ejemplo

triangulo::Int->Int->Int->String
triangulo a b c
| a==b&&b==c&&c==b="triangulo equiltero"
| a==b||a==c||b==c="triangulo issceles"
| (a^2 + b^2)==c^2||a^2 + c^2==b^2||c^2 + b^2==a^2="triangulo
rectngulo"
| otherwise="triangulo escaleno"

Preguntas

Asignacin #4
Resolucin de Problemas
Para la presentacin:
matemticos con Haskell
En clase se expondr un problema
Entregar un trabajo escrito con lo seleccionado al azar.
siguiente:
Cada grupo debe explicar 1
Introduccin
problema y presentar ejecucin y el
Para cada problema
resto de los grupos debe realizar
1.Enunciado
aportes
2.Marco Terico
Se evaluaran:
3.Planteamiento
Trabajo Escrito
4.Codigo debidamente
Presentacin y ayuda Visual
documentado (adicional archivo hs) Dominio del Tema/Investigacin
Conclusiones
Corrida del Programa
Modalidad: Grupos
Referencias.
Fecha: Lunes 4 de agosto
www.haskell.org
http://aprendehaskell.es/main.html

You might also like