tema 2: introducción a haskell · 2012-02-10 · el lenguaje haskell tipos constructores de tipos...
Post on 06-May-2020
15 Views
Preview:
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
top related