Your SlideShare is downloading. ×
0
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Haskell
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Haskell

1,809

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,809
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
29
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Programación Funcional Haskell Elementos de Haskell Programación Funcional en Haskell Lenguajes de Programación René Mac Kinney Romero UAM - Iztapalapa 18 de Enero de 2012LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 2. Programación Funcional Haskell Elementos de HaskellResumen Programación Funcional Filosofía Modelo de reescritura Haskell Denición de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 3. Programación Funcional Filosofía Haskell Modelo de reescritura Elementos de HaskellResumen Programación Funcional Haskell Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 4. Programación Funcional Filosofía Haskell Modelo de reescritura Elementos de HaskellResumen Programación Funcional Filosofía Modelo de reescritura Haskell Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 5. Programación Funcional Filosofía Haskell Modelo de reescritura Elementos de HaskellOtra forma de proponer la computación Basada en el Calculo Lambda de Church y Kleene Toda expresión computable se puede expresar como expresión λ Se caracteriza por programar con valores, funciones y formas funcionales. Es declarativo, se describe como son las funciones y no como calcularlas. Para calcular el valor de las funciones se utiliza el modelo de la reducción β (β -redex) LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 6. Programación Funcional Filosofía Haskell Modelo de reescritura Elementos de HaskellResumen Programación Funcional Filosofía Modelo de reescritura Haskell Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 7. Programación Funcional Filosofía Haskell Modelo de reescritura Elementos de HaskellNo importa el orden en que se evalúe una función, siempre seobtiene el mismo resultado.Es decir que podemos evaluar una expresión en cualquier orden ysiempre obtendremos el mismo resultado. Dadas f (x ) =x ∗x +2 g (y ) =y +y f (g (5)) = g (5) ∗ g (5) + 2 = 10 ∗ 10 + 2 = 102 = f (5 + 5) = f (10) = 10 ∗ 10 + 2 = 102 LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 8. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraResumen Programación Funcional Haskell Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 9. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraHaskell Lenguaje funcional. Hugs Interprete que calcula formas normales. GHC Compilador de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 10. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraResumen Programación Funcional Haskell Denición de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 11. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraLa denición de las siguientes funciones f x =x +2 fact (n) = n × fact (n − 1) fact (0) =1se hace en Haskell de la siguiente maneraf x = x + 2fact (n) = n * fact (n-1)fact (0) = 1 LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 12. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraLa función tiene que ir en la primera columna. Si la función ocupamás de un renglón debe tener sangría a partir del segundo renglón.fact (n) = n * fact (n-1) LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 13. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraResumen Programación Funcional Haskell Denición de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 14. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos Reescritura/em prelude_ ← cosas a evaluarprelude 5+510 ⇒ Da resultadoprelude 23423*763421788158666 ⇒ Es el resultadoprelude :? ← ayudaprelude x - x*3+sin(x)ERROR - Cannot find showfunction for:*** Expression : x - x * 3 + sin x*** Of type : Double - Double ⇒ Da resultado LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 15. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos Reescrituraprelude (x - x*3+sin(x)) 411.2431975046921 ⇒ Es el resultadoprelude let f = (x - sin(x∧2)) in f 4-0.287903316665065 ⇒ Es el resultado LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 16. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraResumen Programación Funcional Haskell Denición de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 17. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraHaskell es fuertemente tipicado y podemos utilizar los siguientestipos básicos: Tipo Nombre Ejemplo Int entero 5 Fractional fracciones 3/4 Float otante 3.141592 (a,b) tuplas (1,2) Char caracter a [Char] cadena Hola (que es una lista de caracteres H o l a)Para saber el tipo de una expresión: :type [1,2] ⇒ Tipo de laexpresión LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 18. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraLas listas se representan mediante la notación de corchetes.La lista [1, 2, 3, 4, 5]es de tipo [Int]La lista [1, 2, a , b ]es inválida porque no existe un tipo que se le pueda asignar.Una lista también se puede representar utilizando el constructor : ,por ejemplo [1, 2, 3, 4, 5] ≡ 1 : 2 : 3 : 4 : 5 : []La lista [] es la lista vacía. LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 19. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraEjemploLa siguiente función regresa la longitud de una listalongitud [] = 0longitud (x:xs) = 1 + longitud xsEjemploLa siguiente función concatena dos listas(++) [] (x:xs) = (x:xs)(++) (y:ys) (x:xs) = y:(ys ++ (x:xs)) LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 20. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraResumen Programación Funcional Haskell Denición de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 21. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraEjemploCon reescritura obtenemos el valor de una funciónObtener la longitud de la lista [1,2,3]. longitud [1,2,3] = 1 + longitud [2,3] = 1 + (1 + longitud [3]) = 1 + (1 + (1 + longitud [])) = 1 + (1 + (1 + 0)) = 3 LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 22. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos Reescrituralongitud ([4, 5] + +[9, 8]) es: = longitud (4 : ([5] + +[9, 8])) = 1+longitud ([5] + +[9, 8])) = 1+longitud ([5] + +[9, 8])) = longitud (4 : 5 : ([] + +[9, 8])) = 1+longitud (5 : ([] + +[9, 8])) = longitud (4 : 5 : [9, 8]) = 1 + 1+longitud ([] + +[9, 8])) = 1+longitud 5 : [9, 8] = 1 + 1+longitud [9, 8] = 1 + 1+longitud [9, 8] = 1 + 1 + 1+longitud [8] = 1 + 1 + 1+longitud [8] = 1 + 1 + 1 + 1+longitud [] = 1 + 1 + 1 + 1+longitud [] = 1+1+1+1+0 = 1+1+1+1+0 = 4 = 4 Solución 1 Solución 2 LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 23. Programación Funcional Denición de funciones Haskell Interprete de Haskell Elementos de Haskell Listas y tipos ReescrituraNotas Siempre se debe obtener el mismo resultado, no importando el camino. La forma en que una expresión esta completamente reducida (es decir ya no se puede reescribir) se llama forma normal. LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 24. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosResumen Programación Funcional Haskell Elementos de Haskell LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 25. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosResumen Programación Funcional Haskell Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 26. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosNo hay estructuras de control, pero si existe la función especial if -then - else .EjemploUtilización de la función if-then-else en Haskell.f x = if x 2 then 0 else 1g y = if y 0 then 3Nota: La construcción del if-then no tiene sentido, ya que siempredebe haber algo con lo cual se pueda reescribir g (−1)no tiene con que reescribirse. LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 27. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosResumen Programación Funcional Haskell Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 28. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosPara comentarios se utilizan dos guiones seguidos.-- comentariof x = x*x -- esta función calcula el cuadrado de un número LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 29. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosResumen Programación Funcional Haskell Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 30. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosHaskell es fuertemente tipicado y en la mayoría de veces elintérprete o el compilador son capaces de inferir el tipo de lafunción. g x = x `mod` 3 1El tipo inferido es g :: Integral a = a - apara expresar en Haskell un tipo se utiliza:g :: Tipo - Tipo 1 Es decir que a es de un tipo Integral y g toma un parámetro de tipo a yregresa un resultado de tipo a LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 31. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosResumen Programación Funcional Haskell Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 32. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosEl prelude (preludio) dene la biblioteca básica de funciones, entreellas encontramos: head lista Regresa la cabeza de la lista. tail lista Regresa el resto de la lista (todos menos la cabeza). elemento lista Función constructor de la lista. zip lista1 lista2 Hace tuplas con los elementos de lista1 y lista2. LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 33. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosEjemploEjemplos Preludioprelude head [1,2,3]1 ⇒ cabeza de la lista.prelude tail [1,2,3][2,3] ⇒ lista sin primer elemento.prelude zip [] [1,2,3][] ⇒ lista vacia.prelude zip [1,2,3] [5,6,7][(1,5),(2,6),(3,7)] ⇒ lista de zip. LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 34. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosMas Ejemplos Preludio Podemos denir: len l = if l == [] then 0 else 1 + (len tail l) usando el else Ejemplo Obtener la longitud de la lista [1, 2, 3]. 1 + (len[2,3]) = 1+ (1+ len [3]) =1+(1+(1+ len [])) =1+(1+(1+0)) =3 LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 35. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosLo usual es usar la función cons (:) con la que podemos escribirlistas como x : xs len [] = 0 len (x :xs )= ... mínimo un término.Donde x es la cabeza de la lista y xs es el cuerpo.El apareamiento con el lado izquierdo de la ecuación debe ser único.⇒ len (x :xs ) = 1 + len xs LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 36. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosQuicksort Ejemplo Quicksort quicksort (x:xs) = (quicksort (less x xs)) ++ [x] ++ (quicksort (more x xs)) less x [] = [] less x (y:ys) = if (x y) then y:(less x ys) else (less x ys) more x [] = [] more x (y:ys) = if (x y) then y:(more x ys) else (more x ys) LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 37. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosMas ejemplos Ejemplo Función para sumar una lista de enteros. sum [] = 0 sum x:xs = x + sum xs Ejemplo Función que suma las coordenadas x de una lista de coordenadas sumcx [] = 0 sumcx (s:ss)= x + sumcx ss where (x,y) = s LP 12I - René Mac Kinney Romero Programación Funcional en Haskell
  • 38. Programación Funcional Estructuras de control Haskell Comentarios Elementos de Haskell Fuertemente tipicado Preludio y EjemplosEjemploInvierte cadena.inv [] = []inv (x:xs) = inv xs ++ [x] inv [1, 2, 3] 1/x , [2, 3]/xs inv [2, 3] ++ [1] inv [3] ++ [2] ++ [1] inv [] ++ [3] ++ [2] ++ [1] ⇒ [3 , 2 , 1 ] LP 12I - René Mac Kinney Romero Programación Funcional en Haskell

×