1 / 60

Un lenguaje funcional avanzado: Haskell

Un lenguaje funcional avanzado: Haskell. Salvador Lucas Alba Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia http://www.dsic.upv.es/~slucas. Objetivos. Introducir la sintaxis básica de Haskell

quang
Télécharger la présentation

Un lenguaje funcional avanzado: Haskell

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Un lenguaje funcional avanzado: Haskell Salvador Lucas AlbaDepartamento de Sistemas Informáticos y ComputaciónUniversidad Politécnica de Valenciahttp://www.dsic.upv.es/~slucas

  2. Objetivos • Introducir la sintaxis básica de Haskell • Aprender a utilizar el intérprete Hugs para ejecutar programas escritos en Haskell

  3. Desarrollo • Introducción a Haskell • Nivel léxico • Expresiones • Declaraciones

  4. Desarrollo • Introducción a Haskell • Nivel léxico • Expresiones • Declaraciones

  5. Introducción a Haskell Características principales • Permite al usuario definir sus propios tipos y estructuras de datos • Dispone de los tipos predefinidos usuales (booleanos, enteros, caracteres, cadenas, …) con las operaciones predefinidas habituales • Soporta distintos niveles de polimorfismo: • Polimorfismo paramétrico • Polimorfismo ‘ad-hoc’ (sobrecarga)

  6. Introducción a Haskell Características principales • Un programa es un conjunto de definiciones de función realizadas mediante ecuaciones condicionales • Pueden emplearse expresiones let y where así como las reglas de ‘layout’ • Funciones de orden superior • La evaluación de expresiones es ‘perezosa’ (lazy)

  7. Introducción a Haskell Características principales • Los programas pueden organizarse en modulos o ‘librerías’ • Los programas Haskell suelen llevar la extensión ‘hs’. • El módulo Prelude.hs contiene definiciones de tipos y funciones que pueden utilizarse de forma inmediata en cualquier programa

  8. Introducción a Haskell Module ProgHaskell Importación/Exportación de módulos Definición de tipos y estructuras de datos Definición de funciones

  9. Introducción a Haskell Prelude.hs Definición de tipos y estructuras de datos Definición de funciones

  10. Desarrollo • Introducción a Haskell • Nivel léxico • Expresiones • Declaraciones

  11. Nivel léxico Identificadores • Un identificador Haskell consta de una letra seguida por cero o más letras, dígitos, subrayados y comillas simples. • Los identificadores son case-sensitive (el uso de minúsculas o mayúsculas importa)

  12. Nivel léxico Identificadores • Como en todos los lenguajes, hay ‘palabras reservadas’: case, data, deriving, do, else, if, import, let, module, of, then, type, where… • La letra inicial del identificador distingue familias de identificadores: empiezan por • Mayúscula los tipos y constructores de datos • Minúscula los nombres de función y variables

  13. Nivel léxico Identificadores • Ejemplo: Bool, Int, Char, String(predef) • dataColor= Red | Green | Blue • dataLaboral= Lu | Ma | Mi | Ju | Vi • dataTreeInt= LInt| BTreeIntTreeInt • dataTreet = Lt | B (Treet) (Treet) Constructores de tipos Mayusc. Minusc. Variables de tipo Constructores de datos

  14. Nivel léxico • Ejemplo: factn | n==0 = 1 | n>0 = n*fact (n-1) length[] = 0 length(x:xs) = 1+lengthxs Nombres de función Mayusc. Constructores de datos Minusc. Variables

  15. Nivel léxico Operadores • Se pueden especificar operadores: cadenas de símbolos escogidos entre !, #, $, %, &, *, +, -, ., /, <, =, >, ?, @, \, :,… • Ejemplo: +!+, <&, <=>, … • Si queremos utilizar el operador como constructor de datos debe empezar por ‘:’

  16. Nivel léxico Comentarios • Un trozo de texto en un programa puede ‘comentarse’ encerrándolo entre {- -} o bien, si es una sola línea, precediéndolo de --

  17. Nivel léxico Números • Los enteros se escriben de la manera habitual: • 0, 45, -3452, 2147493647 • Los números en coma flotante también:0.31426, -23.12, 567.347, 4523.0 • 231.61e7, 231.6e-2, -3.412e03

  18. Nivel léxico Caracteres • Los caracteres se escriben así: • ‘a’, ‘b’, ..., ‘A’, ‘B’, ..., ‘1’, ‘2’, ... • ‘\a’, ‘\b’, ‘\f’, ‘\n’, ‘\r’, ... • ‘\BEL’, ‘\BS’, ‘\FF’, ‘\LF’, ‘\CR’, ... • ‘\7’, ‘\8’, ‘\12’, ‘\10’, ‘\13’, ... • ‘\o7’, ‘\o10’, ‘\o14’, ‘\o12’, ‘\o15’ • ‘\x7’, ‘\x8’, ‘\xC’, ‘\xA’, ‘\xD’, ...

  19. Nivel léxico Cadenas • Los cadenas de caracteres son secuencias de caracteres entre comillas dobles: • “”, • “1&bA”, • “Esta frase \10ocupa dos lineas”

  20. Desarrollo • Introducción a Haskell • Nivel léxico • Expresiones • Declaraciones

  21. Expresiones Llamada a una función • Dado un nombre de función • f • y expresiones • e1, e2, …, ek • la expresión • ( f e1 e2 ··· ek ) • representa la llamada a la función f con argumentos e1, e2, …, ek ¡Paréntesis externos! ¡No hay ‘comas’!

  22. Expresiones Llamada a una función • Ejemplos: • (fact 10) • (length “abcd”) • (fact (length “abcd”))

  23. Expresiones Llamada a una función • También es válido: • fact 10 • length “abcd” • fact (length “abcd”)

  24. Expresiones Utilización de operadores • Dado un operador (binario) • Å • y expresiones • e1, e2 • la expresión • (e1Å e2) • representa la aplicación del operador Å a sus argumentos e1, e2

  25. Expresiones Utilización de operadores • Ejemplos: • (10 + 3) • (“abcd” ++ “123”) • ((a:“bcd” ) ++ “123”)

  26. Expresiones Utilización de operadores • También es válido: • 10 + 3 • “abcd” ++ “123” • (a:“bcd” ) ++ “123”

  27. Expresiones • Por supuesto, se pueden combinar • fact (10 + 3) • length (“abcd” ++ “123”) • length ((a:“bcd” ) ++ “123”)

  28. Expresiones Condicionales • La expresión condicional puede utilizarse en su sintaxis ‘infija’: • fact n = if n==0 then 1 else n*(fact (n-1))

  29. Expresiones Listas • Por su frecuente uso en programación funcional, se han desarrollado (y se admiten) distintas notaciones para expresar listas: • 1:2:3:[] (igual a 1:(2:(3:[])) ) • [1,2,3] • 1:[2,3] • corresponden a la misma lista (:) es asociativo por la derecha

  30. Expresiones Listas • La notación de listas aritméticas permite expresar secuencias de enteros: • [2..10] es [2,3,4,5,6,7,8,9,10] • [1..] es [1,2,3,4,... • [1,3..10] es [1,3,5,7,9] • [1,3..] es [1,3,5,7,9,...

  31. Expresiones Listas • También se puede utilizar para expresar secuencias de caracteres o booleanos: • [’a’..’e’] es “abcde” • [False ..] es [False,True] • [’a’,’e’..’z’] es “aeimquy”

  32. Expresiones Expresiones lambda • Una función f se describe mediante una expresión lambda de la forma \ x1 · · · xk -> e • Las variablesx1, ..., xkson distintas entre sí y las únicas que aparecen en la expresión e

  33. Expresiones Expresiones lambda • Ejemplo \ x y -> x+y \ x -> 2*x \ x -> True \ m n -> B (L m) (L n)

  34. Desarrollo • Introducción a Haskell • Nivel léxico • Expresiones • Declaraciones

  35. Declaraciones Tipos definidos por el usuario • Los tipos ‘de usuario’ se definen junto con los valores que éstos contienen • Ejemplos: • data Color = Red | Green | Blue • data Laboral = Lu | Ma | Mi | Ju | Vi • data TreeInt = L Int | B TreeInt TreeInt • data Tree t = L t | B (Tree t) (Tree t)

  36. Declaraciones Tipos definidos por el usuario • Los valores se obtienen considerando la definición de tipo como una gramática: • Los constructores de datos son símbolos terminales • Los constructores de tipo son símbolos no terminales • Los valores del tipo son los términos del lenguaje generado por la gramática

  37. Declaraciones Tipos definidos por el usuario • Ejemplo: Int := 0 | 1 | 2 | 3 | ··· | -1 | -2 | -3 | ··· TreeInt := L Int | B TreeInt TreeInt Valores de este tipo son: L 1, L -10, B (L 1) (L 10), B (B (L 1) (L1)) (L -1)

  38. Declaraciones Tipos definidos por el usuario • Ejemplo de valor del tipo TreeInt 1 4 3 2 (B (L 1) (B (B (L 2) (L 3)) (L 4)))

  39. Declaraciones Tipos definidos por el usuario • Las siguientes expresiones: L (1+1) B (B (L 1) (L (length “ab”))) (L (fact 2)) son del tipo TreeInt, pero no son valores (contienen símbolos no constructores)

  40. Declaraciones Definición de funciones • En los lenguajes funcionales, lo normal es definir las funciones mediante ecuaciones empleando (y combinando) distintas técnicas: • parámetros formales • guardas • ajuste de patrones • distinción de casos • cláusulas where

  41. Definición de funciones Parámetros formales • Una función f se describe mediante ecuaciones de la forma: f x1 · · · xk = r • Las variablesx1, ..., xkson distintas entre sí y las únicas que aparecen en la parte derecha r

  42. Definición de funciones Parámetros formales • Ejemplos: doble x = x+x triple x = 3*x seisveces x = doble (triple x) fact n = if n==0 then 1 else n*fact (n-1)

  43. Definición de funciones Parámetros formales • Ejemplos: doble x = x + x triple x = 3 * x Funciones primitivas

  44. Definición de funciones Parámetros formales • Ejemplos: doble x = x+x triple x = 3*x seisveces x =doble(triplex) Otras funciones de usuario

  45. Definición de funciones Parámetros formales • Ejemplos: doble x = x+x triple x = 3*x seisveces x = doble (triple x) factn = if n==0 then 1 else n*fact(n-1) Recursividad

  46. Definición de funciones Parámetros formales y guardas • Una función f se describe mediante ecuaciones de la forma: f x1 · · · xk | c = r donde c es una expresión booleana

  47. Definición de funciones Parámetros formales y guardas • Ejemplos: fact n | n==0 = 1 | n>0 = n*fact (n-1) sign x | x<0 = neg | x==0 = cero | x>0 = pos

  48. Definición de funciones Parámetros formales y guardas • Ejemplos: fact n | n==0 = 1 | n>0 = n*fact (n-1) sign x | x<0 = neg | x==0 = cero | x>0 = pos Guardas

  49. Definición de funciones Ajuste de patrones • Una función f se describe mediante ecuaciones de la forma: f p1 · · · pk = r • Los patronesp1, ..., pkson términos constituidos por constructores de datos y variables

  50. Definición de funciones Ajuste de patrones • Ejemplos: length [] = 0 length (x:xs) = 1+length xs data Nat = Cero | S Nat first Cero _ = [] first (S n) (x:xs) = x:(first n xs)

More Related