Un lenguaje funcional avanzado:  Haskell
Objetivos <ul><li>Introducir la sintaxis básica de  Haskell </li></ul><ul><li>Aprender a utilizar el intérprete  Hugs  par...
Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>D...
Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>D...
Características principales <ul><li>Permite al usuario definir sus  propios  tipos y estructuras de datos </li></ul><ul><l...
Características principales <ul><li>Un programa es un conjunto de definiciones de función realizadas mediante  ecuaciones ...
Características principales <ul><li>Los programas pueden organizarse en  modulos  o ‘ librerías ’ </li></ul><ul><li>Los pr...
Introducción a Haskell Importación/Exportación de módulos Definición de tipos y estructuras de datos Definición de funcion...
Introducción a Haskell Definición de tipos y estructuras de datos Definición de funciones Prelude.hs
Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>D...
<ul><li>Un  identificador  Haskell consta de una letra seguida por cero o más letras, dígitos, subrayados y comillas simpl...
<ul><li>Como en todos los lenguajes, hay ‘palabras reservadas’: </li></ul><ul><li>case, data, deriving, do, else, if, impo...
Nivel léxico <ul><li>Ejemplo:  Bool ,  Int ,  Char ,  String   (predef) </li></ul><ul><ul><ul><li>data   Color   =  Red  |...
Nivel léxico Constructores de datos Nombres de función Mayusc. Minusc. <ul><li>Ejemplo:  </li></ul><ul><li>fact     n |  n...
<ul><li>Se pueden especificar  operadores : cadenas de símbolos escogidos entre  </li></ul><ul><li>!, #, $, %, &, *, +, -,...
<ul><li>Un trozo de texto en un programa puede ‘comentarse’ encerrándolo entre  </li></ul><ul><li>{-  -} </li></ul><ul><li...
<ul><li>Los enteros se escriben de la manera habitual: </li></ul><ul><ul><li>0, 45, -3452, 2147493647 </li></ul></ul><ul><...
Caracteres <ul><li>Los caracteres se escriben así: </li></ul><ul><ul><li>‘ a’, ‘b’, ..., ‘A’, ‘B’, ..., ‘1’, ‘2’, ... </li...
Cadenas <ul><li>Los  cadenas de caracteres  son secuencias de caracteres entre comillas dobles:  </li></ul><ul><ul><li>“” ...
Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>D...
<ul><li>Dado un nombre de función </li></ul><ul><li>  f   </li></ul><ul><li>y expresiones </li></ul><ul><li>  e 1 , e 2 , ...
<ul><li>Ejemplos: </li></ul><ul><ul><li>( fact  10) </li></ul></ul><ul><ul><li>( length  “abcd”) </li></ul></ul><ul><ul><l...
<ul><li>También es válido: </li></ul><ul><ul><li>fact  10 </li></ul></ul><ul><ul><li>length  “abcd” </li></ul></ul><ul><ul...
Expresiones Utilización de operadores <ul><li>Dado un operador (binario) </li></ul><ul><li>   </li></ul><ul><li>y expresi...
<ul><li>Ejemplos: </li></ul><ul><ul><li>(10  +  3) </li></ul></ul><ul><ul><li>(“abcd”  ++  “123”) </li></ul></ul><ul><ul><...
<ul><li>También es válido: </li></ul><ul><ul><li>10  +  3 </li></ul></ul><ul><ul><li>“ abcd”  ++  “123” </li></ul></ul><ul...
<ul><li>Por supuesto, se pueden combinar </li></ul><ul><ul><li>fact  (10  +  3) </li></ul></ul><ul><ul><li>length  (“abcd”...
<ul><li>La expresión condicional puede utilizarse en su sintaxis ‘infija’: </li></ul><ul><ul><li>fact n =  if   n==0  then...
Expresiones Listas <ul><li>Por su frecuente uso en programación funcional, se han desarrollado (y se admiten) distintas no...
Expresiones Listas <ul><li>La notación de  listas aritméticas  permite expresar secuencias de enteros: </li></ul><ul><li>[...
Expresiones Listas <ul><li>También se puede utilizar para expresar secuencias de caracteres o booleanos: </li></ul><ul><li...
Expresiones lambda <ul><li>Una función  f   se describe mediante una  expresión lambda  de la forma </li></ul>  x 1  · · ·...
Expresiones lambda <ul><li>Ejemplo </li></ul><ul><li> x y -> x+y </li></ul><ul><li> x -> 2*x </li></ul><ul><li> x -> True ...
Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>D...
Tipos definidos por el usuario Declaraciones <ul><li>Los tipos ‘de usuario’ se definen junto con los  valores  que éstos c...
<ul><li>Los  valores  se obtienen considerando la definición de tipo como una  gramática : </li></ul><ul><ul><li>Los const...
<ul><li>Ejemplo: </li></ul><ul><ul><li>Int := 0 | 1 | 2 | 3 | ··· | -1 | -2 | -3 | ··· </li></ul></ul><ul><ul><li>TreeInt ...
1 4 2 3 (B (L 1) (B (B (L 2) (L 3)) (L 4))) <ul><li>Ejemplo de  valor  del tipo  TreeInt </li></ul>Tipos definidos por el ...
<ul><li>Las siguientes expresiones: </li></ul><ul><ul><li>L (1+1)  </li></ul></ul><ul><ul><li>B (B (L 1) (L (length “ab”))...
Definición de funciones <ul><li>En los lenguajes funcionales, lo normal es definir las funciones mediante  ecuaciones  emp...
Parámetros formales Definición de funciones <ul><li>Una función  f   se describe mediante ecuaciones de la forma: </li></u...
Definición de funciones <ul><li>Ejemplos: </li></ul>doble x   = x+x triple x   = 3*x seisveces x  = doble (triple x) fact ...
Definición de funciones <ul><li>Ejemplos: </li></ul>doble x  = x  +  x triple x  = 3  *  x Funciones primitivas Parámetros...
Definición de funciones <ul><li>Ejemplos: </li></ul>doble x  = x+x triple x  = 3*x seisveces x =   doble   ( triple   x) O...
Definición de funciones <ul><li>Ejemplos: </li></ul>doble x  = x+x triple x  = 3*x seisveces x = doble (triple x) fact   n...
Parámetros formales y guardas Definición de funciones <ul><li>Una función  f   se describe mediante ecuaciones de la forma...
Parámetros formales y guardas Definición de funciones <ul><li>Ejemplos: </li></ul>fact n   |  n==0 = 1   |  n>0  = n*fact ...
Parámetros formales y guardas Definición de funciones <ul><li>Ejemplos: </li></ul>Guardas fact n   |  n==0 = 1   |  n>0  =...
Ajuste de patrones Definición de funciones <ul><li>Una función  f   se describe mediante ecuaciones de la forma: </li></ul...
<ul><li>Ejemplos: </li></ul>length []    = 0 length (x:xs) = 1+length xs data Nat = Cero | S Nat first Cero  _  = [] first...
<ul><li>Ejemplos: </li></ul>Patrones Patrones Ajuste de patrones Definición de funciones length  []     = 0 length  (x:xs)...
Ajuste de patrones Definición de funciones <ul><li>Una expresión  e   se ajusta a  un patrón  p  ( pattern matching ) si  ...
Ajuste de patrones Definición de funciones <ul><li>Ejemplo: la expresión  S (S Cero)  se ajusta al patrón  S x  pero  no  ...
Ajuste de patrones Definición de funciones El ajuste de patrones permite  clasificar  datos  y  explorar   /   recuperar  ...
Distinción de casos Definición de funciones <ul><li>Una función  f   se describe mediante ecuaciones de la forma: </li></u...
Distinción de casos Definición de funciones <ul><li>Ejemplo: </li></ul>length   xs = case xs of   [ ] -> 0   (y:ys) -> 1+l...
Cláusulas  where Definición de funciones <ul><li>Una función  f   se describe mediante ecuaciones de la forma: </li></ul>f...
Definición de funciones <ul><li>Ejemplo: </li></ul>raicesEc2   a b c = ((-b+d)/a’,(-b-d)/a’) where  d = sqrt(b^2-4*a*c) a’...
Bibliografía [Bir00]  R. Bird. Introducción a la Programación Funcional con Haskell. Prentice-Hall, Madrid, 2000. [Dav92] ...
: = 
Upcoming SlideShare
Loading in...5
×

Intro haskell

835

Published on

una introduccion al lenguaje gaskell...

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
835
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
41
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Intro haskell

  1. 1. Un lenguaje funcional avanzado: Haskell
  2. 2. Objetivos <ul><li>Introducir la sintaxis básica de Haskell </li></ul><ul><li>Aprender a utilizar el intérprete Hugs para ejecutar programas escritos en Haskell </li></ul>
  3. 3. Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>Declaraciones </li></ul>
  4. 4. Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>Declaraciones </li></ul>
  5. 5. Características principales <ul><li>Permite al usuario definir sus propios tipos y estructuras de datos </li></ul><ul><li>Dispone de los tipos predefinidos usuales ( booleanos , enteros , caracteres , cadenas , …) con las operaciones predefinidas habituales </li></ul><ul><li>Soporta distintos niveles de polimorfismo : </li></ul><ul><ul><li>Polimorfismo paramétrico </li></ul></ul><ul><ul><li>Polimorfismo ‘ad-hoc’ (sobrecarga) </li></ul></ul>Introducción a Haskell
  6. 6. Características principales <ul><li>Un programa es un conjunto de definiciones de función realizadas mediante ecuaciones condicionales </li></ul><ul><li>Pueden emplearse expresiones let y where así como las reglas de ‘ layout ’ </li></ul><ul><li>Funciones de orden superior </li></ul><ul><li>La evaluación de expresiones es ‘ perezosa ’ (lazy) </li></ul>Introducción a Haskell
  7. 7. Características principales <ul><li>Los programas pueden organizarse en modulos o ‘ librerías ’ </li></ul><ul><li>Los programas Haskell suelen llevar la extensión ‘ hs ’. </li></ul><ul><li>El módulo Prelude.hs contiene definiciones de tipos y funciones que pueden utilizarse de forma inmediata en cualquier programa </li></ul>Introducción a Haskell
  8. 8. Introducción a Haskell Importación/Exportación de módulos Definición de tipos y estructuras de datos Definición de funciones Module ProgHaskell
  9. 9. Introducción a Haskell Definición de tipos y estructuras de datos Definición de funciones Prelude.hs
  10. 10. Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>Declaraciones </li></ul>
  11. 11. <ul><li>Un identificador Haskell consta de una letra seguida por cero o más letras, dígitos, subrayados y comillas simples. </li></ul><ul><li>Los identificadores son case-sensitive (el uso de minúsculas o mayúsculas importa) </li></ul>Nivel léxico Identificadores
  12. 12. <ul><li>Como en todos los lenguajes, hay ‘palabras reservadas’: </li></ul><ul><li>case, data, deriving, do, else, if, import, let, module, of, then, type, where… </li></ul><ul><li>La letra inicial del identificador distingue familias de identificadores: empiezan por </li></ul><ul><ul><li>Mayúscula los tipos y constructores de datos </li></ul></ul><ul><ul><li>Minúscula los nombres de función y variables </li></ul></ul>Nivel léxico Identificadores
  13. 13. Nivel léxico <ul><li>Ejemplo: Bool , Int , Char , String (predef) </li></ul><ul><ul><ul><li>data Color = Red | Green | Blue </li></ul></ul></ul><ul><ul><ul><li>data Laboral = Lu | Ma | Mi | Ju | Vi </li></ul></ul></ul><ul><ul><ul><li>data TreeInt = L Int | B TreeInt TreeInt </li></ul></ul></ul><ul><ul><ul><li>data Tree t = L t | B ( Tree t ) ( Tree t ) </li></ul></ul></ul>Constructores de tipos Constructores de datos Variables de tipo Mayusc. Minusc. Identificadores
  14. 14. Nivel léxico Constructores de datos Nombres de función Mayusc. Minusc. <ul><li>Ejemplo: </li></ul><ul><li>fact n | n == 0 = 1 </li></ul><ul><li> | n > 0 = n * fact ( n - 1 ) </li></ul><ul><li>length [] = 0 </li></ul><ul><li>length ( x : xs ) = 1 + length xs </li></ul>Variables
  15. 15. <ul><li>Se pueden especificar operadores : cadenas de símbolos escogidos entre </li></ul><ul><li>!, #, $, %, &, *, +, -, ., /, <, =, >, ?, @, , :,… </li></ul><ul><li>Ejemplo: +!+, <&, <=>, … </li></ul><ul><li>Si queremos utilizar el operador como constructor de datos debe empezar por ‘:’ </li></ul>Nivel léxico Operadores
  16. 16. <ul><li>Un trozo de texto en un programa puede ‘comentarse’ encerrándolo entre </li></ul><ul><li>{- -} </li></ul><ul><li>o bien, si es una sola línea, precediéndolo de </li></ul><ul><li>-- </li></ul>Nivel léxico Comentarios
  17. 17. <ul><li>Los enteros se escriben de la manera habitual: </li></ul><ul><ul><li>0, 45, -3452, 2147493647 </li></ul></ul><ul><li>Los números en coma flotante también: 0.31426 , -23.12 , 567.347 , 4523.0 </li></ul><ul><li>231.61e7, 231.6e-2, -3.412e03 </li></ul>Números Nivel léxico
  18. 18. Caracteres <ul><li>Los caracteres se escriben así: </li></ul><ul><ul><li>‘ a’, ‘b’, ..., ‘A’, ‘B’, ..., ‘1’, ‘2’, ... </li></ul></ul><ul><ul><li>‘ a’, ‘b’, ‘f’, ‘n’, ‘r’, ... </li></ul></ul><ul><ul><li>‘ BEL’, ‘BS’, ‘FF’, ‘LF’, ‘CR’, ... </li></ul></ul><ul><ul><li>‘ 7’, ‘8’, ‘12’, ‘10’, ‘13’, ... </li></ul></ul><ul><ul><li>‘ o7’, ‘o10’, ‘o14’, ‘o12’, ‘o15’ </li></ul></ul><ul><ul><li>‘ x7’, ‘x8’, ‘xC’, ‘xA’, ‘xD’, ... </li></ul></ul>Nivel léxico
  19. 19. Cadenas <ul><li>Los cadenas de caracteres son secuencias de caracteres entre comillas dobles: </li></ul><ul><ul><li>“” , </li></ul></ul><ul><ul><li>“ 1&bA”, </li></ul></ul><ul><ul><li>“ Esta frase 10ocupa dos lineas” </li></ul></ul>Nivel léxico
  20. 20. Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>Declaraciones </li></ul>
  21. 21. <ul><li>Dado un nombre de función </li></ul><ul><li> f </li></ul><ul><li>y expresiones </li></ul><ul><li> e 1 , e 2 , …, e k </li></ul><ul><li>la expresión </li></ul><ul><li>( f e 1 e 2 ··· e k ) </li></ul><ul><li>representa la llamada a la función f con argumentos e 1 , e 2 , …, e k </li></ul>Llamada a una función Expresiones ¡Paréntesis externos! ¡No hay ‘comas’!
  22. 22. <ul><li>Ejemplos: </li></ul><ul><ul><li>( fact 10) </li></ul></ul><ul><ul><li>( length “abcd”) </li></ul></ul><ul><ul><li>( fact ( length “abcd”)) </li></ul></ul>Expresiones Llamada a una función
  23. 23. <ul><li>También es válido: </li></ul><ul><ul><li>fact 10 </li></ul></ul><ul><ul><li>length “abcd” </li></ul></ul><ul><ul><li>fact ( length “abcd”) </li></ul></ul>Expresiones Llamada a una función
  24. 24. Expresiones Utilización de operadores <ul><li>Dado un operador (binario) </li></ul><ul><li>  </li></ul><ul><li>y expresiones </li></ul><ul><li> e 1 , e 2 </li></ul><ul><li>la expresión </li></ul><ul><li>( e 1  e 2 ) </li></ul><ul><li>representa la aplicación del operador  a sus argumentos e 1 , e 2 </li></ul>
  25. 25. <ul><li>Ejemplos: </li></ul><ul><ul><li>(10 + 3) </li></ul></ul><ul><ul><li>(“abcd” ++ “123”) </li></ul></ul><ul><ul><li>((a : “bcd” ) ++ “123”) </li></ul></ul>Expresiones Utilización de operadores
  26. 26. <ul><li>También es válido: </li></ul><ul><ul><li>10 + 3 </li></ul></ul><ul><ul><li>“ abcd” ++ “123” </li></ul></ul><ul><ul><li>(a : “bcd” ) ++ “123” </li></ul></ul>Expresiones Utilización de operadores
  27. 27. <ul><li>Por supuesto, se pueden combinar </li></ul><ul><ul><li>fact (10 + 3) </li></ul></ul><ul><ul><li>length (“abcd” ++ “123”) </li></ul></ul><ul><ul><li>length ((a : “bcd” ) ++ “123”) </li></ul></ul>Expresiones
  28. 28. <ul><li>La expresión condicional puede utilizarse en su sintaxis ‘infija’: </li></ul><ul><ul><li>fact n = if n==0 then 1 else n*(fact (n-1)) </li></ul></ul>Expresiones Condicionales
  29. 29. Expresiones Listas <ul><li>Por su frecuente uso en programación funcional, se han desarrollado (y se admiten) distintas notaciones para expresar listas: </li></ul><ul><li>1:2:3:[] (igual a 1:(2:(3:[])) ) </li></ul><ul><li>[1,2,3] </li></ul><ul><li>1:[2,3] </li></ul><ul><li>corresponden a la misma lista </li></ul>(:) es asociativo por la derecha
  30. 30. Expresiones Listas <ul><li>La notación de listas aritméticas permite expresar secuencias de enteros: </li></ul><ul><li>[2..10] es [2,3,4,5,6,7,8,9,10] </li></ul><ul><li>[1..] es [1,2,3,4,... </li></ul><ul><li>[1,3..10] es [1,3,5,7,9] </li></ul><ul><li>[1,3..] es [1,3,5,7,9,... </li></ul>
  31. 31. Expresiones Listas <ul><li>También se puede utilizar para expresar secuencias de caracteres o booleanos: </li></ul><ul><li>[’a’..’e’] es “abcde” </li></ul><ul><li>[False ..] es [False,True] </li></ul><ul><li>[’a’,’e’..’z’] es “aeimquy ” </li></ul>
  32. 32. Expresiones lambda <ul><li>Una función f se describe mediante una expresión lambda de la forma </li></ul> x 1 · · · x k -> e <ul><li>Las variables x 1 , ..., x k son distintas entre sí y las únicas que aparecen en la expresión e </li></ul>Expresiones
  33. 33. Expresiones lambda <ul><li>Ejemplo </li></ul><ul><li> x y -> x+y </li></ul><ul><li> x -> 2*x </li></ul><ul><li> x -> True </li></ul><ul><li> m n -> B (L m) (L n) </li></ul>Expresiones
  34. 34. Desarrollo <ul><li>Introducción a Haskell </li></ul><ul><li>Nivel léxico </li></ul><ul><li>Expresiones </li></ul><ul><li>Declaraciones </li></ul>
  35. 35. Tipos definidos por el usuario Declaraciones <ul><li>Los tipos ‘de usuario’ se definen junto con los valores que éstos contienen </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><ul><li>data Color = Red | Green | Blue </li></ul></ul></ul><ul><ul><ul><li>data Laboral = Lu | Ma | Mi | Ju | Vi </li></ul></ul></ul><ul><ul><ul><li>data TreeInt = L Int | B TreeInt TreeInt </li></ul></ul></ul><ul><ul><ul><li>data Tree t = L t | B (Tree t) (Tree t) </li></ul></ul></ul>
  36. 36. <ul><li>Los valores se obtienen considerando la definición de tipo como una gramática : </li></ul><ul><ul><li>Los constructores de datos son símbolos terminales </li></ul></ul><ul><ul><li>Los constructores de tipo son símbolos no terminales </li></ul></ul><ul><li>Los valores del tipo son los términos del lenguaje generado por la gramática </li></ul>Tipos definidos por el usuario Declaraciones
  37. 37. <ul><li>Ejemplo: </li></ul><ul><ul><li>Int := 0 | 1 | 2 | 3 | ··· | -1 | -2 | -3 | ··· </li></ul></ul><ul><ul><li>TreeInt := L Int | B TreeInt TreeInt </li></ul></ul><ul><ul><li>Valores de este tipo son: </li></ul></ul><ul><ul><li>L 1, L -10, B (L 1) (L 10), B (B (L 1) (L1)) (L -1) </li></ul></ul>Tipos definidos por el usuario Declaraciones
  38. 38. 1 4 2 3 (B (L 1) (B (B (L 2) (L 3)) (L 4))) <ul><li>Ejemplo de valor del tipo TreeInt </li></ul>Tipos definidos por el usuario Declaraciones
  39. 39. <ul><li>Las siguientes expresiones: </li></ul><ul><ul><li>L (1+1) </li></ul></ul><ul><ul><li>B (B (L 1) (L (length “ab”))) (L (fact 2)) </li></ul></ul><ul><li>son del tipo TreeInt, pero no son valores (contienen símbolos no constructores) </li></ul>Tipos definidos por el usuario Declaraciones
  40. 40. Definición de funciones <ul><li>En los lenguajes funcionales, lo normal es definir las funciones mediante ecuaciones empleando (y combinando) distintas técnicas: </li></ul><ul><ul><li>parámetros formales </li></ul></ul><ul><ul><li>guardas </li></ul></ul><ul><ul><li>ajuste de patrones </li></ul></ul><ul><ul><li>distinción de casos </li></ul></ul><ul><ul><li>cláusulas where </li></ul></ul>Declaraciones
  41. 41. Parámetros formales Definición de funciones <ul><li>Una función f se describe mediante ecuaciones de la forma: </li></ul>f x 1 · · · x k = r <ul><li>Las variables x 1 , ..., x k son distintas entre sí y las únicas que aparecen en la parte derecha r </li></ul>
  42. 42. Definición de funciones <ul><li>Ejemplos: </li></ul>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) Parámetros formales
  43. 43. Definición de funciones <ul><li>Ejemplos: </li></ul>doble x = x + x triple x = 3 * x Funciones primitivas Parámetros formales
  44. 44. Definición de funciones <ul><li>Ejemplos: </li></ul>doble x = x+x triple x = 3*x seisveces x = doble ( triple x) Otras funciones de usuario Parámetros formales
  45. 45. Definición de funciones <ul><li>Ejemplos: </li></ul>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) Recursividad Parámetros formales
  46. 46. Parámetros formales y guardas Definición de funciones <ul><li>Una función f se describe mediante ecuaciones de la forma: </li></ul>f x 1 · · · x k | c = r donde c es una expresión booleana
  47. 47. Parámetros formales y guardas Definición de funciones <ul><li>Ejemplos: </li></ul>fact n | n==0 = 1 | n>0 = n*fact (n-1) sign x | x<0 = neg | x==0 = cero | x>0 = pos
  48. 48. Parámetros formales y guardas Definición de funciones <ul><li>Ejemplos: </li></ul>Guardas fact n | n==0 = 1 | n>0 = n*fact (n-1) sign x | x<0 = neg | x==0 = cero | x>0 = pos
  49. 49. Ajuste de patrones Definición de funciones <ul><li>Una función f se describe mediante ecuaciones de la forma: </li></ul>f p 1 · · · p k = r <ul><li>Los patrones p 1 , ..., p k son términos constituidos por constructores de datos y variables </li></ul>
  50. 50. <ul><li>Ejemplos: </li></ul>length [] = 0 length (x:xs) = 1+length xs data Nat = Cero | S Nat first Cero _ = [] first (S n) (x:xs) = x:(first n xs) Ajuste de patrones Definición de funciones
  51. 51. <ul><li>Ejemplos: </li></ul>Patrones Patrones Ajuste de patrones Definición de funciones length [] = 0 length (x:xs) = 1+length xs data Nat = Cero | S Nat first Cero _ = [] first (S n) (x:xs) = x:(first n xs)
  52. 52. Ajuste de patrones Definición de funciones <ul><li>Una expresión e se ajusta a un patrón p ( pattern matching ) si e puede verse como una concreción de p (dando ciertos valores a las variables libres de p ) </li></ul>
  53. 53. Ajuste de patrones Definición de funciones <ul><li>Ejemplo: la expresión S (S Cero) se ajusta al patrón S x pero no al patrón Cero </li></ul>S (S Cero) S x Cero S (S Cero) X { x := S Cero}
  54. 54. Ajuste de patrones Definición de funciones El ajuste de patrones permite clasificar datos y explorar / recuperar subestructuras de los mismos
  55. 55. Distinción de casos Definición de funciones <ul><li>Una función f se describe mediante ecuaciones de la forma: </li></ul>f p 1 · · · p k = case x of q 1 -> e 1 ... q n -> e n <ul><li>Donde p 1 · · · p k, q 1 · · · q n son patrones, x es una variable y e 1 · · · e n expresiones </li></ul>
  56. 56. Distinción de casos Definición de funciones <ul><li>Ejemplo: </li></ul>length xs = case xs of [ ] -> 0 (y:ys) -> 1+length ys
  57. 57. Cláusulas where Definición de funciones <ul><li>Una función f se describe mediante ecuaciones de la forma: </li></ul>f p 1 · · · p k = e where l 1 = r 1 ... l n = r n <ul><li>Donde l 1 · · · l n son patrones o partes izquierdas de definiciones de función, y r 1 · · · r n son expresiones </li></ul>
  58. 58. Definición de funciones <ul><li>Ejemplo: </li></ul>raicesEc2 a b c = ((-b+d)/a’,(-b-d)/a’) where d = sqrt(b^2-4*a*c) a’ = 2*a Cláusulas where
  59. 59. Bibliografía [Bir00] R. Bird. Introducción a la Programación Funcional con Haskell. Prentice-Hall, Madrid, 2000. [Dav92] A.J. Davie. An Introduction to Functional Programming Systems Using Haskell. Cambridge University Press, Cambridge, UK, 1992. [Pey03] S. Peyton Jones, editor. Haskell 98: Language and Libraries. The Revised Report. Cambridge University Press, 2003. Página WWW de Haskell: http://www.haskell.org
  60. 60. : = 
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×