Programacin Funcional en Haskell nLaboratorio de Matemticas Discretas II nLic. Wilber Ramos Lovn n Ingeniera Informtica n Universidad Catlica San Pablo Lic. Wilber Ramos Lovn Captulo 1 Conceptos Fundamentales Lic. Wilber Ramos Lovn Software Programas + Datos = Software Lic. Wilber Ramos Lovn Datos n Son cualquier tipo de informacin almacenable. Por ejemplo: w Nmeros w Programas w Canciones en Cds w Mapas w Clicks del mouse Lic. Wilber Ramos Lovn Programas n Programas calculan nuevos datos de antiguos datos Lic. Wilber Ramos Lovn Construyendo sistemas de Software n Un sistema largo puede contener muchos millones de lineas de cdigo. n Los sistemas de software estan entre los mas complejos artefactos alguna vez hechos. n Estos estn construidos por la combinacin de la mayor cantidad de componentes que sea posible. Volvo compra partes de Mistubishi Bonnier compra Quicktime de Apple Lic. Wilber Ramos Lovn Lenguajes de Programacin n Programas estan escritos en lenguajes de programacin. n Hay cientos de lenguajes de programacin diferentes, cada uno con sus fortalezas y debilidades. n Un sistema grande a menudo contendr componentes en muchos lenguajes diferentes. Lic. Wilber Ramos Lovn Qu lenguaje ensear? Lenguajes Funcionales Lenguajes Imperativos Haskell ML Scheme Erlang C C++ Cobol Fortran Visual C++ Assembler Visual Basic Java Lic. Wilber Ramos Lovn Usos industriales de lenguajes funcionales n Intel (verificacin de microprocesadores). n Hewlett Packard (correlacin de eventos de telecomunicacin). n Ericsson(telecomunicaciones). n Carlstedt Research & Technology (Programacin de las cuadrillas de aire). n Shop.com (e-commerce). n Thompson (rastreo de radares). n Motorola (generacin de pruebas) Lic. Wilber Ramos Lovn Porqu antiguos lenguajes sobreviven? n Cdigo legado n Programadores legados Lic. Wilber Ramos Lovn Porqu Haskell? n Haskell es un lenguaje de muy alto nivel (muchos detalles son tomados en cuenta automaticamente). n Haskell es expresivo y conciso (puede lograr mucho con poco esfuerzo). n Haskell es bueno manejando datos complejos y combinando componentes n Haskell no es un lenguaje de alta performance(prioriza tiempo-programador sobre tiempo-clculo) Lic. Wilber Ramos Lovn Programacin Funcional n Una funcin es una forma de calcular un resultado desde los argumentos de la funcin. Lic. Wilber Ramos Lovn Programacin Funcional n Una funcin es una forma de calcular un resultado desde los argumentos de la funcin. f(x) = sen x/cos x game(clicks del mouse) = animacin de pantalla n Un programa funcional calcula sus resultados en funcin de sus entradas. Lic. Wilber Ramos Lovn Valores y expresiones n Un valor es una pieza de datos. 2,4, 3.14159,Jhon n Las expresiones combinan valores usando funciones y operadores 2+2,2*pi*r Una expresin calcula un valor. Lic. Wilber Ramos Lovn Operaciones n Los operadores son siempre explcitos b^2-4*a*c n NO pueden escribirse como b 2 -4ac n Significa (b^2)-(4*a*c) no b^((2-4)a*c) La multiplicacin (*) se asocia antes que la resta(-). Lic. Wilber Ramos Lovn Definiciones y tipos n Una definicin le da un nombre a un valor. area::Int area=41*43 Lic. Wilber Ramos Lovn Definiciones de funcin n Una definicin de una funcin especifica como es calculado el resultado desde los argumentos. cuadrado::Int->Int cuadrado x = x*x Lic. Wilber Ramos Lovn Notacin de funcin n Los argumentos de funcin no necesitan ser encerrados entre parntesis. area::Int->Int->Int area b h = b*h Lic. Wilber Ramos Lovn Programacin funcional n Un programa funcional consiste en su mayor parte de definicin de funciones. n Las Funciones Simples son usadas para definir otras mas complejas, las cuales son usadas para definir otras an ms complejas, y as en adelante. n Definimos una funcin para calcular el resultado de nuestro programa final desde sus entradas. Si puedes escribir definiciones de funciones,puedes escribir programas funcionales.! Lic. Wilber Ramos Lovn Un tour de algunos tipos bsicos De las matemticas, estamos acostumbrados a funciones con nmeros como argumentos y resultados. En programacin, usualmente trabajamos con valores de tipos mucho ms ricos. Algunos tipos estn comprendidos en los lenguajes de programacin (nmeros) , otros los define el programador (mp3). Vamos a recorrer algunos tipos incluidos en Haskell. Lic. Wilber Ramos Lovn Tipos : Enteros 1,2,3,4,. :: Int nAlgunas operaciones: 2+3 --------- 5 2*3 --------- 6 2^3 --------- 8 mod 7 2 ----- 1 div 7 2 ----- 3 Lic. Wilber Ramos Lovn Tipos : Nmeros reales 1.3,2.5,0.453,3.14159,. :: Float nAlgunas operaciones: 2.5+ 3.5 --------- 7.0 3 - 1.2 --------- 2.8 2/3 --------- 0.333 sin (pi/4) ------- 0.7071 1.4142^2 ------- 1.99996 Lic. Wilber Ramos Lovn Tipos : Listas [1,2,3],[7,10] :: [Int] nAlgunas operaciones: [2,4,5]++[3,6,8] --------- [2,4,5,3,6,8] head [4,5,7,8,9] --------- 4 last [6,7,2,1,9] --------- 9 Lic. Wilber Ramos Lovn Test Cmo podras agregar 4 al final de la lista [1,2,3]? Lic. Wilber Ramos Lovn Test Cmo podras agregar 4 al final de la lista [1,2,3]? [1,2,3]++[4] Lic. Wilber Ramos Lovn Tipos : Cadenas Hola mundo! :: String n Algunas operaciones: Hola++Mundo --------- Hola Mundo show(2*3) --------- 6 Lic. Wilber Ramos Lovn Test Es 2+2 igual a 4? Lic. Wilber Ramos Lovn Test Es 2+2 igual a 4? NO! 2+2 es una cadena de tres caracteres 4 es una cadena de un caracter No son el mismo texto! Lic. Wilber Ramos Lovn Tipos : Comandos writeFile myfile Hola! :: IO() readFile myfile ::IO String Lic. Wilber Ramos Lovn Test Si myfile contiene Hola!, es readFile myfile igual a Hola! ? Lic. Wilber Ramos Lovn Test Si myfile contiene Hola!, es readFile myfile igual a Hola! ? NO! El resultado de una funcin depende solo de sus argumentos; Hola! no puede ser calculado de myfile. Lic. Wilber Ramos Lovn Efectos de los comandos n El resultado de una funcin depende solo de sus argumentos. n El efecto de un comando puede ser diferente, dependiendo de cuando este es ejecutado. Lic. Wilber Ramos Lovn Tipos : Funciones double 2 -------- 4 es una llamada a la funcion double (sin argumentos) es un valor de funcin double :: Int ->Int double x = x+x Lic. Wilber Ramos Lovn Composicin de Funciones cuadruple 2 -------- doble (doble 2) doble 4 8 cuadruple :: Int ->Int cuadruple = doble.doble Lic. Wilber Ramos Lovn La Funcin map dobles [1,2,3] -------- [doble 1, doble 2, doble 3] [2,4,6] dobles :: [Int] ->[Int] dobles = map doble Lic. Wilber Ramos Lovn Funciones de orden superior n La habilidad para computar funciones (=programas) es una de las ms grandes fortalezas de Haskell. n Largas partes de un programa pueden ser computadas (escritas por las computadoras), ms que programadas a mano.