Clase 3

Anuncio
Pattern Matching y Nuevos tipos
Taller de Álgebra I
Cuatrimestre de verano de 2015
Repaso
Repaso de los ejercicios de tarea.
minimo :: [Integer] -> Integer
ordenada :: [Integer] -> Bool
eliminarRepetidos :: [Integer] -> [Integer]
Pattern Matching
Pattern Matching
El Pattern Matching consiste en especificar patrones para algún dato que luego de
verificar el patrón será deconstruido en sus componentes para poder utilizarlas por
separado.
En Números
fact :: Integer -> Integer -> Integer
fact 0 = 1
fact n = n * fact ( n - 1)
enIngles
enIngles
enIngles
enIngles
enIngles
enIngles
enIngles
:: Integer -> [ Char ]
1 = " One ! "
2 = " Two ! "
3 = " Three ! "
4 = " Four ! "
5 = " Five ! "
x = " Not sure : s "
Pattern Matching: Tuplas
Pattern Matching
El Pattern Matching consiste en especificar patrones para algún dato que luego de
verificar el patrón será deconstruido en sus componentes para poder utilizarlas por
separado.
En Tuplas
sumarVectores :: ( Int , Int ) -> ( Int , Int ) -> ( Int , Int )
sumarVectores a b = ( fst a + fst b , snd a + snd b )
sumarVectores2 :: ( Int , Int ) -> ( Int , Int ) -> ( Int , Int )
sumarVectores2 ( x1 , y1 ) ( x2 , y2 ) = ( x1 + x2 , y1 + y2 )
iguales :: ( Int , Int ) -> Bool
iguales (x , x ) = True -- Funciona ?
iguales t = False
Pattern Matching: Listas
Pattern Matching
El Pattern Matching consiste en especificar patrones para algún dato que luego de
verificar el patrón será deconstruido en sus componentes para poder utilizarlas por
separado.
En Listas
head :: [ a ] -> a
head ( x : xs ) = x
tail :: [ a ] -> [ a ]
tail ( _ : xs ) = xs
take
take
take
0 _
_ []
n ( x : xs )
=
=
=
[]
[]
x : take (n -1) xs
Pattern Matching: Ejercicios
Completar las siguientes funciones
first :: (a , b , c ) -> a
first (x , y , z ) =
longitud
longitud
longitud
longitud
longitud
longitud
:: [ a ] -> Integer
[] =
( x :[]) =
( x : y :[]) =
( x : y : z :[]) =
( _ : _ : _ : xs ) =
iniciales :: [ Char ] -> [ Char ] -> [ Char ]
iniciales nombre apellido =
where ( n : _ ) = nombre
( a : _ ) = apellido
Nuevos Tipos: type
Definamos un nuevo tipo
type Conj = [ Integer ]
[1 ,2 ,3 ,4] :: Conj
¿Para qué sirve type?
type Matriz = ( Integer , Integer , Integer , Integer )
type Punto = ( Integer , Integer )
dist :: Punto -> Punto -> Float
Implementar las siguientes funciones
vacio :: Conj
conjuntizar :: [Integer] -> Conj
union :: Conj -> Conj -> Conj
interseccion :: Conj -> Conj -> Conj
Nuevos Tipos: Enumerados
Cómo están definidos los Booleanos
data Bool = False | True
El término data significa que estamos definiendo un nuevo tipo de datos. La parte
antes del igual denota el tipo
Luego del igual están los construtores. Los constructores especifican los diferentes
valores que puede poseer el tipo (La barra vertical denota las distintas opciones de
contrucción de valores del tipo).
Nuevo tipo: Tipo Dia
data Dia = Lunes | Martes | ... | Sabado | Domingo
Definir las siguientes funciones
esFinde :: Dia -> Bool que determina si el dı́a es o no parte del fin de semana.
diaHabil :: Dia -> Bool que determina si el dı́a es un dı́a hábil.
soloMaVi :: [Dia] -> [Dia] que deja en la lista original solo los martes y
viernes.
Ejercicios
implementar la función tuplas que dada una [a] y una [b] calcule la lista
resultante de unir los a con los b para generar una [(a,b)]. Si las listas son de
distinta longitud se deben usar tantos elementos como se pueda. Nota: en Haskell
dicha función es zip.
Ej: tuplas [1,2,3,4] [’a’,’b’,’c’]
[(1,’a’),(2,’b’),(3,’c’)]
implementar la función invertir que dada una [(a,b)] calcule la lista [(b,a)]
resultante de invertir el orden de las componentes de las tuplas.
implementar la función diferencia que devuelve la diferencia entre dos conjuntos.
implementar la función difsim que devuelve la diferencia simétrica entre dos
conjuntos.
(*) implementar la función incluido :: Conj -> Conj -> Bool que indique si
el primero está incluido en el segundo.
(*) implementar la función equivalentes :: Conj -> Conj -> Bool que
indique si dos conjuntos son iguales o no.
implementar la función separar :: Integer -> Conj -> (Conj,Conj) para
que la expresión separar x c retorne el par (c1,c2) tal que c1 ∪ c2 = c y
∀e ∈ c1 · e ≤ x y ∀e ∈ c2 · e > x
Sumatorias
Ejercicio
Calcular las sumas parciales de una lista:
sumParc :: [ Integer ] -> [ Integer ]
ejemplo sumParc [1,2,3,4]
[1,3,6,10]
Y ahora...
Implementar y resolver el item anterior usando:
sumParcAux :: Integer -> [ Integer ] -> [ Integer ]
tal que sumParcAux z [a,b,c]
[z+a,z+a+b,z+a+b+c]
Fibonacci
Más Ejercicios, definir las siguientes funciones:
1
fib :: Integer -> Integer
tal que fib n calcule el n-ésimo número de la serie de fibonacci usando la
formulación clásica.
2
serieFib :: Integer -> [ Integer ]
tal que serieFib n genere toda la serie de fibonacci hasta en n-ésimo número sin
repetir cálculos. Es importante aprovechar los calculos hechos en serieFib (n-1)
para serieFib n.
3
fibRapido :: Integer -> Integer
tal que fibRapido n calcule el n-ésimo número de la serie de fibonacci usando la
función serieFib. Evaluar la diferencia de velocidades entre fib y fibRapido
Listas
Definir las siguientes funciones:
1
prefijos :: [ a ] -> [[ a ]]
que calcule todos los prefijos no vacios de una lista.
Ej: prefijos [1,2,3]
[[1],[1,2],[1,2,3]]
2
sufijos :: [ a ] -> [[ a ]]
que calcule todos los sufijos no vacios de una lista.
Ej: prefijos [1,2,3]
[[1,2,3],[2,3],[3]
3
sublistas :: [ a ] -> [[ a ]]
que calcule todas las sublistas no vacı́as de una lista. Dada una lista [l0 , l1 . . . ln−1 ],
sus sublistas son las listas [li , li+1 , . . . li+k ] ∀i, k ∈ Z | 0 ≤ i ≤ i + k < n.
Logo
data Direccion = Norte | Sur | Este | Oeste deriving Show
type Tortuga = ( Pos , Direccion )
type Pos = ( Int , Int )
Ejercicios
1
arranca :: Tortuga
que devuelva una tortuga en el (0,0) mirando hacia el Norte
2
girarDerecha :: Tortuga -> Tortuga
que gire la tortuga 90 grados a la derecha sin moverla de lugar.
3
girarIzquierda :: Tortuga -> Tortuga
que gire la tortuga 90 grados a la izquierda sin moverla de lugar.
4
avanzar :: Tortuga -> Int -> Tortuga
hace avanzar hacia el lugar donde mira la tortuga la distancia indicada.
Descargar