tema 2: introducción a haskell · 2012-02-10 · el lenguaje haskell tipos constructores de tipos...

62
El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introducci´ on a Haskell A. Ch´ avez-Gonz´ alez 1 A. Riscos-N´ nez 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias de la Computaci´ on e Inteligencia Artificial Universidad de Sevilla http://www.cs.us.es/cursos/lp/ ogica y Programaci´ on, 2006/07 Antonia Ch´ avez, Agust´ ın Riscos, Fernando Sancho Tema 2

Upload: others

Post on 06-May-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Tema 2: Introduccion a Haskell

A. Chavez-Gonzalez1 A. Riscos-Nunez1 F. Sancho-Caparrini1

1Departamento de Ciencias de la Computacion e Inteligencia ArtificialUniversidad de Sevilla

http://www.cs.us.es/cursos/lp/

Logica y Programacion, 2006/07

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 2: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 3: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Caracterısticas

Haskell es un lenguaje funcional puro, no estricto y fuertementetipificado.

Puro: Transparencia referencial. Una expresion denota siempreel mismo valor, en cualquier punto del programa en queaparezca. Razonamiento ecuacional utilizado en matematicas.No estricto: orden no aplicativo. Evaluacion perezosa:

NormalizanteTrabajo mınimoEficienteTrabajo con estructuras de datos infinitas

Tipificacion fuerte: elementos clasificados en categorıas.Sistema de tipos estatico: comprobacion en la compilacionSistema de tipos polimorfico: mas flexiblePermite la sobrecarga: el mismo nombre

Son aconsejables las anotaciones de tipo en los programasAntonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 4: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Un programa Haskell consiste en una o varias definiciones defunciones

Declaracion: tipo

Definicion: metodo de computo

Ejemplo:

-- Un ejemplo de fichero Haskell-- Calcula el siguiente entero al argumentosucesor :: Integer -> Integersucesor x = x + 1-- Calcula la suma de los cuadrados de sus argumentossumaCuadrados :: Integer -> Integer -> IntegersumaCuadrados x y = x * x + y * y

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 5: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 6: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Bool

Expresiones logicas cuyo resultado puede ser verdadero o falso.Constructores:

True, False

Funciones y operadores:

(&&) :: Bool -> Bool -> Bool(||) :: Bool -> Bool -> Boolnot :: Bool -> Boolotherwise :: Bool

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 7: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Int

Numeros enteros de precision limitada en el intervalo[−229, 229 − 1

]Funciones y operadores:

(+)(-)(*) :: Int -> Int -> Int(↑) :: Int -> Int -> Intdiv, mod :: Int -> Int -> Intabs :: Int -> Intsignum :: Int -> Intnegate :: Int -> Inteven, odd :: Int -> Bool

Ejemplo: Podemos definir otras funciones a partir de ellas

maximo :: Int -> Int -> Intmaximo x y = div ((x + y) + abs(x - y)) 2

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 8: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Integer

Los valores son enteros de precision ilimitada que se usancuando los numeros tratados se salen del rango de los valoresdel tipo Int

El calculo es menos eficiente

Las operaciones disponibles son las mismas que para el tipo dedatos Int

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 9: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Float

Numeros reales. Notacion:

1.35, -15.345, 1.0 o 1

1.5e7, 1.5e - 17

Funciones y operadores:

(+)(-)(*)(/) :: Float -> Float -> Float(↑) :: Float -> Int -> Float(**) :: Float -> Float -> Floatabs :: Float -> Floatsignum :: Float -> Float (-1.0, 0.0, 1.0)negate :: Float -> Floatsin, asin, cos, acos, tan, atan :: Float -> Float

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 10: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Float

Funciones y operadores:

atan2 :: Float -> Float -> Floatlog, exp :: Float -> Floatsqrt :: Float -> Floatpi :: Floattrucate, round, floor, ceiling :: Float -> FloatfromInt :: Int -> FloatfromInteger :: Integer -> Float

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 11: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Double

Numeros reales en un intervalo mayor que Float

Mas precision (doble)

Operaciones disponibles: las mismas que para Float

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 12: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Char

Un valor tipo Char representa un caracter (’a’, ’1’, ’?’)Caracteres especiales van precedidos por

\

’\n’ Salto de lınea’\t’ Tabulador’\’’ Comilla’\’’’ Comilla doble’\’ El caracter \

Funciones:

ord :: Char -> Intchr :: Int -> CharisUpper, isLower, isDigit, isAlfa :: Char -> BooltoUpper, toLower :: Char -> Char

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 13: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El tipo Char

Ejemplos:

Prelude> toUpper ’a’’A’ :: CharPrelude> isUpper ’a’False :: BoolPrelude> ord ’a’97 :: IntPrelude> chr 98’b’ :: Char

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 14: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores de igualdad y orden

Para todos los tipos basicos estan definidos los operadores binariosque devuelven un valor booleano:

(<) mayor que (≥) mayor o igual que(<) menor que (≤) menor o igual que(==) igual que (6=) distinto de

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 15: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores de igualdad y orden

El tipo de los dos argumentos debe ser el mismo

Prelude> 10 ≤ 15 Prelude> ’b’ > ’a’True :: Bool True :: BoolPrelude> ’x’ == ’y’ Prelude> False < TrueFalse :: Bool True :: BoolPrelude> ’x’ 6= ’y’ Prelude> (1 < 5) && (10 > 9)True :: Bool True :: BoolPrelude> True < ’a’ERROR : Type error in application*** Expression : True < ’a’*** Term : True*** Type : Bool*** Does not match : Char

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 16: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores de igualdad y orden

Orden para el tipo Char: mayusculas son menores queminusculas. Dentro de cada grupo se mantiene el ordenalfabetico.

Orden para el tipo Bool: False menor que True

(==) es el sımbolo de igualdad, = se reserva para definirfunciones

Para todos los tipos que definen un orden, estan definidas lasfunciones max y min

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 17: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 18: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Ademas de los tipos simples, Haskell define tipos estructuradosque permiten representar colecciones de objetos.

Tuplas

Una tupla es un dato compuesto donde cada componente puedeser de un tipo diferente

Si v1, v2, . . . , vn son valores con tipo t1, t2, . . . , tn, entonces(v1, v2, . . . , vn)es una tupla con tipo (t1, t2, . . . , tn)

Ejemplos:

Prelude> (’a’, True, 1.5)(’a’, True, 1.5) :: (Char, Bool, Double)

Utiles cuando una funcion tiene que devolver mas de un valor

predSuc :: Integer -> (Integer , Integer)predSuc = (x - 1, x + 1)

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 19: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Listas

Una lista es una coleccion de cero o mas elementos todos delmismo tipo. Hay dos constructores u operadores para construirvalores para listas:

[] Lista vacıa

(:) Anade un elemento al princicipo de una lista.

Si v1, v2, . . . , vn son valores con tipo t, entoncesv1 : (v2 : (. . . (vn−1 : (vn : [])) . . . )) es una lista con tipo [t]

Ejemplos:

1 : [] Lista que almacena un unico entero; tipo [Integer ]3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luegoel 1; tipo [Integer ]′a′ : (1 : []) Error de tipo

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 20: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Listas

Una lista es una coleccion de cero o mas elementos todos delmismo tipo. Hay dos constructores u operadores para construirvalores para listas:

[] Lista vacıa

(:) Anade un elemento al princicipo de una lista.

Si v1, v2, . . . , vn son valores con tipo t, entoncesv1 : (v2 : (. . . (vn−1 : (vn : [])) . . . )) es una lista con tipo [t]

Ejemplos:

1 : [] Lista que almacena un unico entero; tipo [Integer ]3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luegoel 1; tipo [Integer ]′a′ : (1 : []) Error de tipo

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 21: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Listas

Asociatividad a la derecha del operador (:). La listax1 : x2 : · · · : xn−1 : xn : [] representarax1 : (x2 : (· · · : (xn−1 : (xn : [])) . . . ))

Haskell permite una sintaxis mas comoda [x1, x2, . . . , xn−1, xn]

Ejemplos:

Prelude> 1:(2:(3:[]))[1,2,3] :: [Integer]

Prelude> 1:2:3:[][1,2,3] :: [Integer]

Prelude> [1,2,3][1,2,3] :: [Integer]

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 22: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Listas

Asociatividad a la derecha del operador (:). La listax1 : x2 : · · · : xn−1 : xn : [] representarax1 : (x2 : (· · · : (xn−1 : (xn : [])) . . . ))

Haskell permite una sintaxis mas comoda [x1, x2, . . . , xn−1, xn]

Ejemplos:

Prelude> 1:(2:(3:[]))[1,2,3] :: [Integer]

Prelude> 1:2:3:[][1,2,3] :: [Integer]

Prelude> [1,2,3][1,2,3] :: [Integer]

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 23: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Cadenas de caracteres

Una cadena de caracteres es una secuencia de cero o mascaracteres.

Lista de caracteres ′′x1x2 . . . xn−1x′′n representa

[′x ′1,′ x ′2, . . . ,

′ x ′n−1,′ x ′n]

Ejemplos:

Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’]‘‘Un Coche’’ :: [Char]

Prelude> ‘‘Un Coche’’‘‘Un Coche’’ :: String

Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[]‘‘Un Coche’’ :: [Char]

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 24: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Cadenas de caracteres

Una cadena de caracteres es una secuencia de cero o mascaracteres.

Lista de caracteres ′′x1x2 . . . xn−1x′′n representa

[′x ′1,′ x ′2, . . . ,

′ x ′n−1,′ x ′n]

Ejemplos:

Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’]‘‘Un Coche’’ :: [Char]

Prelude> ‘‘Un Coche’’‘‘Un Coche’’ :: String

Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[]‘‘Un Coche’’ :: [Char]

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 25: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El constructor de tipo (→)

Para declarar el tipo correspondiente a las funciones.

Si t1, t2, . . . , tn, tr son tipos validos, entoncest1 → t2 → · · · → tn → tr es el tipo de una funcion con nargumentos

Ejemplo:

inc :: Integer -> Integerinc x = x + 1

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 26: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El constructor de tipo (→)

Para declarar el tipo correspondiente a las funciones.

Si t1, t2, . . . , tn, tr son tipos validos, entoncest1 → t2 → · · · → tn → tr es el tipo de una funcion con nargumentos

Ejemplo:

inc :: Integer -> Integerinc x = x + 1

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 27: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

El constructor de tipo (→)

Funciones como argumento o resultado.

Funciones que devuelven otra funcion (orden superior):

componer :: (Int -> Int) -> (Int -> Int) -> Int -> Intcomponer f g x = g (f x)

No pueden eliminarse los parentesiscomponer inc inc 10=⇒ sustituyendo en la definicion de componerinc(inc10)=⇒ por la definicion de inc(inc10) + 1=⇒ por la definicion de inc(10 + 1) + 1 , por la definicion de (+):11 + 1 , y de nuevo por la definicion de (+):12

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 28: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 29: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Insertar comentarios

Dos modos de incluir comentarios (texto ignorado por elevaluador) en un programa:

Comentarios de una sola lınea: comienzan por dos guionesconsecutivos (–) y abarcan hasta el final de la lınea actual:

f :: Integer -> Integerf x = x + 1 -- Esto es un comentario

Comentarios de mas de una lınea: comienzan por loscaracteres {- y acaban con -}

{- Esto es un comentariode mas de una lınea -}g :: Integer -> Integerg x = x - 1

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 30: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 31: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Operadores son funciones binarias cuyo nombre es simbolico(cadena de signos, no letras)

Pueden ser invocados de forma infija

Hay operadores predefinidos como &&, ||,+,−, ∗, /y ↑Podemos definir nuevos operadores utilizando uno o mas delos siguientes sımbolos:: ! #$%& ∗+ · / <=>?@\ ↑ |− ∼∼ solo una vez y al principio. Solo es reservado

Los operadores que comienzan por (:) tienen un significadoespecial, constructores infijos de datos

Ejemplos de operadores:+ + + && || ≤ == 6= · // $ predefinidos@@ % −+−

∨ ∧< + > ?

Reservados: :: → ⇒ : .. = @ \ | ← ∼Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 32: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Clausulas Infix

Al definir un nuevo operador podemos indicar su prioridad (0a 9) y su asociatividadinfix [prioridad] [identificador] No asociativoinfixl [prioridad] [identificador] Asociativo a izda.infixr [prioridad] [identificador] Asociativo a dcha.

Ejemplo de definicion de operador

infix 4 ∼= -- Prioridad 4, no asociativa(∼=) :: Float -> Float -> Bool -- Tipox ∼= y = abs (x - y) < 0.0001 -- Definicion√Obligatorio escribirlo entre parentesis en la declaracion de tipo√Puede usarse de modo infijo

Main> 1.0 ∼= 2.0 Main> 1.0 ∼= 1.00001False :: Bool True :: Bool

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 33: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Prioridades

Ante prioridades distintas, se agrupan en primer lugar los demayor prioridad, en ausencia de parentesis

Ejemplo: La expresion 1 + 2 ∗ 4 se interpreta como 1 + (2 ∗ 4)ya que (∗) tiene mayor prioridad (7) que (+) (6)

Si se desea otra interpretacion, se pueden utilizar parentesis:(1 + 2) ∗ 4

La llamada a una funcion tiene prioridad maxima (10)

La prioridad no aclara que ocurre cuando un mismo operadoraparece varias veces en una expresion: 8− 5− 1 puede serintepretado como ((8− 5)− 1) o (8− (5− 1)). Laasociatividad indica que la primera opcion es la correcta

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 34: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Asociatividades

Si un operador ⊗ es asociativo a la izquierda:

x1 ⊗ x2 ⊗ · · · ⊗ xn−1 ⊗ xn =⇒ (. . . (x1 ⊗ x2)⊗ · · · ⊗ xn−1)⊗ xn

Si un operador ⊗ es asociativo a la derecha:

x1 ⊗ x2 ⊗ · · · ⊗ xn−1 ⊗ xn =⇒ x1 ⊗ (x2 ⊗ · · · ⊗ (xn−1 ⊗ xn) . . . )

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 35: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Asociatividades

Si un operador ⊗ es asociativo a la izquierda:

x1 ⊗ x2 ⊗ · · · ⊗ xn−1 ⊗ xn =⇒ (. . . (x1 ⊗ x2)⊗ · · · ⊗ xn−1)⊗ xn

Si un operador ⊗ es asociativo a la derecha:

x1 ⊗ x2 ⊗ · · · ⊗ xn−1 ⊗ xn =⇒ x1 ⊗ (x2 ⊗ · · · ⊗ (xn−1 ⊗ xn) . . . )

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 36: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Si un operador es no asociativo, no puede utilizarse mas de unavez sin aclarar el significado con parentesis

Ejemplos:

infix 7∧

(∧) :: Integer -> Integer

x∧

y = div x y

Main> 7∧

4∧

2ERROR: Ambiguous use of operator ‘‘

∧‘‘ with ‘‘

∧‘‘

Main> (7∧

4)∧

20 :: IntegerMain> 1 < 2 == TrueERROR: Ambiguous use of operator ‘‘ < ‘‘ with ‘‘== ‘‘

√En Haskell, todo operador no declarado con clausulas infix,

toma por defecto prioridad 9 y asociatividad izquierda.

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 37: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Tabla de Prioridad y Asociatividad de los operadorespredefinidos

infixr 9 ·infixl 9 !!infixr 8 ↑, ↑↑, ∗∗infixl 7 ∗, /, ’quot’, ’rem’, ’div’, ’mod’infixl 6 +, -infixr 5 :, ++infix 4 ==, 6=, <, ≤, ≥, >, ’elem’, ’notElem’infixr 3 &&infixr 2 ‖infixl 1 �, �=infixr 1 =�infixr 0 $, $!, ’seq’

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 38: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Operadores predefinidos su definicionPrioridad y Asociatividad

Operadores frente a funciones

Cualquier operador puede usarse de modo prefijo o infijo,independientemente de como este declarado

infix 4 ∼=(∼=) :: Float -> Float -> Bool(∼=) x y = abs (x - y) < 0.0001Toda funcion puede convertirse en un operador si se escribeentre acentos franceses:

suma :: Integer -> Integer -> Integersuma x y = x + yx ’suma’ y = x + y

Main> suma 1 2 Main> 1 ’suma’ 2

Se puede dar prioridad y asociatividad al uso infijo decualquier funcion: infixl 6 ’suma’

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 39: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Indice

1 El lenguaje Haskell

2 Tipos simples predefinidos

3 Constructores de tipos predefinidos

4 Comentarios

5 OperadoresOperadores predefinidos su definicionPrioridad y Asociatividad de los operadores

6 Patrones y Otras utilidadesPatrones y otros tipos de Expresiones

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 40: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Comparacion de patrones

En Haskell los parametros formales de una funcion no solopueden ser nombres de variables, un argumento puede ser unpatron (una expresion)

Es posible definir una funcion dando mas de una ecuacionpara esta. Cada ecuacion definira el comportamiento de lafuncion para distintas formas del argumento.

Los patrones capturan dicha forma√

Al aplicar una funcion a un parametro concreto lacomparacion de patrones determina la ecuacion a utilizar

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 41: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones constantes

Un patron constante puede ser un numero, un caracter o unconstructor de datos.

f :: Integer -> Bool= Truef 2 = False

Main> f 1True :: BoolMain> f 3Program error: f 3

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 42: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones constantes

La funcion esta parcialmente definida. Si queremos definirlatotalmente, anadimos otra ecuacion:

f :: Integer -> Integerf 1 = Truef 2 = False -- Tercera lıneaf x = True

√Atencion al orden. ¿Y si apareciera f 1 False en la terceralınea?

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 43: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones constantes

Con un patron constante solo unifica un argumento quecoincida con esa constanteCuando la funcion tiene mas de un argumento:

Se comprueban los patrones correspondientes a las distintasecuaciones en el orden dado por el programa, hasta que seencuentre una que coincidaDentro de una misma ecuacion se intentan unificar los patronescorrespondientes a los argumentos de izquierda a derechaCuando un patron falla para un argumento, se pasa a lasiguiente ecuacion

La funcion que se esta definiendo puede aparecer como partede la expresion resultado: RECURSIVIDAD

El uso de patrones y recursividad permite definicionescompactas y elegantes

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 44: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Recursividad

Ejemplo:

fact :: Integer -> Integerfact 0 = 1fact n = n * fact(n - 1)

Para que una definicion recursiva sea efectiva hay que garantizarque:

Exista un caso no recursivo, al menos. Caso base. En elejemplo, fact0

En cada llamada recursiva, el valor del argumento se “acerca”al caso base

El caso base se alcanza, es decir, la reduccion acaba. Comoen el ejemplo.

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 45: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Recursividad

Si una de estas condiciones falla, la reduccion no terminara:

fact’ :: Integer -> Integerfact’ 0 = 1fact’ n = n * (n - 1) * fact’ (n - 2)-- Falla la tercera condicion.-- No termina para impares

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 46: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones para listas

Los patrones que se usan al definir funciones que trabajen conlistas toman las siguientes formas:

[] Solo unifica con un argumento que sea una lista vacıa

[x ], [x , y ], etc. solo unifican con listas de uno, dos, etc.argumentos

(x : xs) unifica con listas con al menos un elemento

(x : y : zs) unifica con listas con al menos dos elementos...

suma :: [Integer] -> Integersuma [] = 0 -- Caso basesuma (x:xs) = x + suma xs -- Caso recursivo

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 47: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones para tuplas

Puede usarse la sintaxis de tuplas en patrones

primero2 :: (Integer, Integer) -> Integerprimero2 (x, y) = x -- Primero para paresprimero3 :: (Integer, Integer, Integer) -> Integerprimero3 (x, y, z) = x -- Primero para ternas

Los patrones pueden anidarse

sumaPares :: [(Integer, Integer)] -> IntegersumaPares [] = 0sumaPares ((x, y):xs) = x + y + sumaPares xs

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 48: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones aritmeticos

Un patron aritmetico es de la forma (n + k), donde k es unnumero natural

factorial :: Integer -> Integerfactorial 0 = 1factorial (n + 1) = (n + 1) * factorial n

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 49: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones nombrados o Seudonimos

Un patron seudonimo o patron alias sirve para nombrar un patronutilizar el seudonimo en vez del patron en la parte derecha de ladefinicion

factorial’’ :: Integer -> Integerfactorial’’ 0 = 1factorial’’ m@(n + 1) = m * factorial’’ n

El cualificador @ en la segunda ecuacion asigna el seudonimo m alpatron (n + 1)

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 50: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patron subrayado

Un patron subrayado ( ) unifica con cualquier argumento pero noestablece ninguna ligadura

longitud :: [Integer] -> Integerlongitud [] = 0longitud ( :xs) = 1 + longitud xs

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 51: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Patrones y evaluacion perezosa

La unificacion determina que ecuacion es seleccionada para reduciruna expresion a partir de la forma de los argumentos

esVacıa :: [a] -> BoolesVacıa [] = TrueesVacıa ( : ) = False

Para poder reducir una expresion como esVacıa l es necesario sabersi l es una lista vacıa o no√

Haskell evalua un argumento hasta obtener un numero deconstructores suficiente para resolver el patron, sin obtenernecesariamente su forma normal

infinita :: [Integer] esVacıa infinitainfinita = 1: infinita =⇒ esVacıa (1: infinita)

FalseAntonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 52: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Expresiones case

La sintaxis de esta construccion es:case expr of

patron1 → resultado1

patron2 → resultado2

. . .patronn → resultadon

Todos los patrones son del mismo tipo (el mismo que el de expr)Todos los resultados deben ser del mismo tipo, el tipo del resultadoEjemplo:

long :: [Integer] -> Integerlong ls = case ls of

[] → 0:xs → 1 + long xs

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 53: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

La funcion error

Permite controlar casos sin sentido en funciones parciales y generarun mensaje de error

cabeza’ :: [Integer] -> Integercabeza’ [] = error ‘‘lista vacıa’’cabeza’ (x: ) = x

Main> cabeza’ [1, 2, 3]1 :: IntegerMain> cabeza’ []Program error: lista vacıa

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 54: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Funciones a trozos (por partes)

En ellas el resultado depende de cierta condicion

absoluto :: Integer -> Integerabsoluto x

| x ≥ 0 = x| x < 0 = -x

El sangrado es obligatorio (con el tabulador, no espacios)

Guardas, son de tipo Bool

Se evaluan las guardas en el orden textual hasta encontrar unvalor True, en cuyo caso se devuelve la expresion a la derechade dicha guarda

Puede usarse como guarda otherwise, que equivale a True

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 55: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Expresiones condicionales

Otro modo de escribir expresiones cuyo resultado depende decierta condicion:if exprBool then exprSi else exprNo

Funcionamiento:

Se evalua exprBool , de tipo BoolSi el valor es True, devuelve exprNoEn otro caso, exprSi

Los tipos de ambos resultados deben coincidir√

Al ser perezoso, no se evalua mas que el resultado que sedevuelve

Es valida la expresion 2 ∗ if ′a′ < ′z ′ then 10 else 4

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 56: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Expresiones condicionales

Ejemplo:

maxEnt :: Integer -> Integer -> IntegermaxEnt x y = if x ≥ y then x else y

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 57: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Definiciones locales

Nombrando subexpresiones:raices :: Float → Float → Float → (Float,Float)raices a b c| b2 − 4 ∗ a ∗ c ≥ 0 = ((−b + sqrt(b2 − 4 ∗ a ∗ c))/(2 ∗ a),

(−b − sqrt(b2 − 4 ∗ a ∗ c))/(2 ∗ a))| otherwise = error“raices complejas ′′

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 58: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Definiciones locales

raices :: Float → Float → Float → (Float,Float)raices a b c| disc ≥ 0 = ((−b + raizDisc)/denom, (−b− raizDisc)/denom)| otherwise = error“raices complejas ′′

wheredisc = b2 − 4 ∗ a ∗ craizDisc = sqrt discdenom = 2 ∗ a

Las definiciones locales where solo pueden aparecer a final de unadefinicion de funcion

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 59: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Definiciones locales

Para introducir definiciones locales en cualquier parte de unaexpresion se usa let e in.

Prelude> let f n = n ↑ 2 + 2 in f 10010002 :: Integer

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 60: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Expresiones lambda

Haskell permite definir funciones anonimas

Ejemplo: λ x → x + 1

Con un argumento:

Prelude> :t λ x -> isUpper xλ x -> isUpper x :: Char -> Bool

Con mas de un argumento:

Prelude> :t λ x y -> isUpper x && isUpper yλ x y -> isUpper x && isUpper y :: Char -> Char ->BoolPrelude> (λ x y -> isUpper x && isUpper y) ’A’ ’z’

False :: Bool

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 61: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Sangrado

Cuando acaba una definicion

Definiciones globales

Definiciones locales introducidas por where, let

Alternativa al layout: llaves y ;

h x y = let {dob n = 2 * n; tri n = 3 * n}in dob x + tri y

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2

Page 62: Tema 2: Introducción a Haskell · 2012-02-10 · El Lenguaje Haskell Tipos Constructores de tipos Comentarios Operadores Patrones y Otras utilidades Tema 2: Introduccion a Haskell

El Lenguaje HaskellTipos

Constructores de tiposComentariosOperadores

Patrones y Otras utilidades

Patrones y otros tipos de Expresiones

Ambitos y modulos

Reglas de ambitos

f :: Integer -> Integerf x = x * h 7

whereh z = x + 5 + z ^ 2

(+++) :: Integer -> Integer -> Integera +++ b = 2 * a + f b

import

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 2