3_Programacion Funcional Con Haskell

Download 3_Programacion Funcional Con Haskell

Post on 12-Apr-2015

52 views

Category:

Documents

6 download

Embed Size (px)

TRANSCRIPT

<p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Programacin Funcional en HaskellLenguajes de Programacin</p> <p>Ren Mac Kinney RomeroUAM - Iztapalapa</p> <p>17 de Septiembre de 2012</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>ResumenProgramacin Funcional Filosofa Modelo de reescritura Haskell Denicin de funciones Interprete de Haskell Listas y tipos Reescritura Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Filosofa Modelo de reescritura</p> <p>Resumen</p> <p>Programacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Filosofa Modelo de reescritura</p> <p>Resumen</p> <p>Programacin Funcional Filosofa Modelo de reescritura</p> <p>Haskell</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Filosofa Modelo de reescritura</p> <p>Otra forma de proponer la computacin Basada en el Calculo Lambda de Church y Kleene Toda expresin computable se puede expresar como expresin</p> <p>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 reduccin</p> <p> ( -redex)</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Filosofa Modelo de reescritura</p> <p>Resumen</p> <p>Programacin Funcional Filosofa Modelo de reescritura</p> <p>Haskell</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Filosofa Modelo de reescritura</p> <p>No importa el orden en que se evale una funcin, siempre se obtiene el mismo resultado. Es decir que podemos evaluar una expresin en cualquier orden y siempre obtendremos el mismo resultado. Dadas</p> <p>f (x ) g (y )</p> <p>=x x +2 =y +y = g (5) g (5) + 2 = 10 10 + 2 = 102 = f (5 + 5) = f (10) = 10 10 + 2 = 102</p> <p>f (g (5))</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Resumen</p> <p>Programacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Haskell Lenguaje funcional. Hugs Interprete que calcula formas normales. GHC Compilador de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>ResumenProgramacin Funcional</p> <p>Haskell Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>La denicin de las siguientes funciones</p> <p>f x</p> <p>=x +2 = n fact (n 1) =1</p> <p>fact (n) fact (0)</p> <p>se hace en Haskell de la siguiente manera</p> <p>f x = x + 2 fact (n) = n * fact (n-1) fact (0) = 1</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>La funcin tiene que ir en la primera columna. Si la funcin ocupa ms de un rengln debe tener sangra a partir del segundo rengln.</p> <p>fact (n) =</p> <p>n * fact (n-1)</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>ResumenProgramacin Funcional</p> <p>Haskell Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>prelude&gt;_ cosas prelude&gt; 5+5 10 Da resultado</p> <p>a evaluar</p> <p>prelude&gt; 23423*76342 1788158666 Es el resultado prelude&gt; :? ayuda</p> <p>prelude&gt; \x -&gt; x*3+sin(x) ERROR - Cannot find "show"function for: *** Expression : \x -&gt; x * 3 + sin x *** Of type : Double -&gt; Double Da resultado</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>prelude&gt; (\x -&gt; x*3+sin(x)) 4 11.2431975046921 Es el resultado prelude&gt; let f = (\x -&gt; sin(x2)) in f 4 -0.287903316665065 Es el resultado</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>ResumenProgramacin Funcional</p> <p>Haskell Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Haskell es fuertemente tipicado y podemos utilizar los siguientes tipos bsicos: Tipo Int Fractional Float (a,b) Char Nombre entero fracciones otante tuplas caracter cadena Ejemplo 5 3/4 3.141592 (1,2) 'a' Hola (que es una lista de caracteres 'H' 'o' 'l' 'a') Para saber el tipo de una expresin: expresin</p> <p>[Char]</p> <p>:type [1,2] </p> <p>Tipo de la</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Las listas se representan mediante la notacin de corchetes. La lista</p> <p>[1, 2, 3, 4, 5]es de tipo [Int] La lista</p> <p>[1, 2,</p> <p>a</p> <p>,</p> <p>b</p> <p>]</p> <p>es invlida porque no existe un tipo que se le pueda asignar. Una lista tambin se puede representar utilizando el constructor : , por ejemplo</p> <p>[1, 2, 3, 4, 5] 1 : 2 : 3 : 4 : 5 : []La lista</p> <p>[]</p> <p>es la lista vaca.</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>EjemploLa siguiente funcin regresa la longitud de una lista</p> <p>longitud [] = 0 longitud (x:xs) = 1 + longitud xs</p> <p>EjemploLa siguiente funcin concatena dos listas</p> <p>(++) [] (x:xs) = (x:xs) (++) (y:ys) (x:xs) = y:(ys ++ (x:xs))</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>ResumenProgramacin Funcional</p> <p>Haskell Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>EjemploCon reescritura obtenemos el valor de una funcinObtener 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</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>longitud = = = = = = = = =</p> <p>([4, 5] + +[9, 8]) es: longitud (4 : ([5] + +[9, 8])) 1+longitud ([5] + +[9, 8])) 1+longitud ([5] + +[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 + 1+longitud [] 1+1+1+1+0</p> <p>= longitud = = = = = =</p> <p>(4 : 5 : ([] + +[9, 8])) longitud (4 : 5 : [9, 8]) 1+longitud 5 : [9, 8] 1 + 1+longitud [9, 8] 1 + 1 + 1+longitud [8] 1 + 1 + 1 + 1+longitud [] 1+1+1+1+0</p> <p>= 4</p> <p>= 4</p> <p>Solucin 1</p> <p>Solucin 2</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Denicin de funciones Interprete de Haskell Listas y tipos Reescritura</p> <p>Notas</p> <p>Siempre se debe obtener el mismo resultado, no importando el camino. La forma en que una expresin esta completamente reducida (es decir ya no se puede reescribir) se llama forma normal.</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Resumen</p> <p>Programacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>ResumenProgramacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>No hay estructuras de control, pero si existe la funcin especial if -</p> <p>then - else .</p> <p>EjemploUtilizacin de la funcin if-then-else en Haskell.</p> <p>f x = if x &gt; 2 then 0 else 1 g y = if y &gt; 0 then 3Nota: La construccin del if-then no tiene sentido, ya que siempredebe haber algo con lo cual se pueda reescribir</p> <p>gno tiene con que reescribirse.</p> <p>(1)</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>ResumenProgramacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Para comentarios se utilizan dos guiones seguidos.</p> <p>-- comentario f x = x*x -- esta funcin calcula el cuadrado de un nmero</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>ResumenProgramacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Haskell es fuertemente tipicado y en la mayora de veces elintrprete o el compilador son capaces de inferir el tipo de la funcin.</p> <p>g x = x `mod` 3El tipo inferido es1</p> <p>g</p> <p>:: Integral</p> <p>a =&gt; a -&gt; a</p> <p>para expresar en Haskell un tipo se utiliza:</p> <p>g :: Tipo -&gt; TipoEs decir que a es de un tipo Integral y g toma un parmetro de tipo a y regresa un resultado de tipo a1</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>ResumenProgramacin Funcional</p> <p>Haskell</p> <p>Elementos de Haskell Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>El prelude (preludio) dene la biblioteca bsica de funciones, entre ellas encontramos:</p> <p>head lista Regresa la cabeza de la lista. tail lista Regresa el resto de la lista (todos menos la cabeza). elemento lista Funcin constructor de la lista. zip lista1 lista2 Hace tuplas con los elementos de lista1 y lista2.</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>EjemploEjemplos Preludio</p> <p>prelude&gt; head [1,2,3] 1 cabeza de la lista. prelude&gt; tail [1,2,3] [2,3] lista sin primer elemento. prelude&gt; zip [] [1,2,3] [] lista vacia. prelude&gt; zip [1,2,3] [5,6,7] [(1,5),(2,6),(3,7)] lista de zip.</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Mas Ejemplos PreludioPodemos denir:</p> <p>len l = if l == [] then 0 else 1 + (len tail l)usando el else</p> <p>EjemploObtener 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</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Lo usual es usar la funcin cons (:) listas como x len</p> <p>con la que podemos escribir</p> <p>: xs</p> <p>[] = 0</p> <p>len (x :xs )= ... mnimo un trmino. Donde x es la cabeza de la lista y xs es el cuerpo. El apareamiento con el lado izquierdo de la ecuacin debe ser nico.</p> <p>len (x :xs ) = 1</p> <p>+</p> <p>len xs</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>QuicksortEjemploQuicksort</p> <p>quicksort [] = [] quicksort (x:xs) = (quicksort (less x xs)) ++ [x] ++ (quicksort (more x xs)) less x [] = [] less x (y:ys) = if (x &gt; y) then y:(less x ys) else (less x ys) more x [] = [] more x (y:ys) = if (x &lt; y) then y:(more x ys) else (more x ys)LP 12I - Ren Mac Kinney Romero Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>Mas ejemplosEjemploFuncin para sumar una lista de enteros.</p> <p>sum [] = 0 sum (x:xs) =</p> <p>x + sum xs</p> <p>EjemploFuncin que suma las coordenadas x de una lista de coordenadas</p> <p>sumcx [] = 0 sumcx (s:ss)= x + sumcx ss where (x,y) = sLP 12I - Ren Mac Kinney Romero Programacin Funcional en Haskell</p> <p>Programacin Funcional Haskell Elementos de Haskell</p> <p>Estructuras de control Comentarios Fuertemente tipicado Preludio y Ejemplos</p> <p>EjemploInvierte cadena.</p> <p>inv [] = [] inv (x:xs) = inv xs ++ [x]inv [1, 2, 3] inv [2, 3] inv [3] inv [] [3 , 2 , 1 ] 1/x , [2, 3]/xs ++ [1] ++ [2] ++ [1] ++ [3] ++ [2] ++ [1]</p> <p>LP 12I - Ren Mac Kinney Romero</p> <p>Programacin Funcional en Haskell</p>