Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Taller de Algebra: Haskell, Apuntes de Álgebra

Taller de Algebra: Haskell UBA

Tipo: Apuntes

2017/2018

Subido el 28/09/2018

nahuel-acevedo
nahuel-acevedo 🇦🇷

3 documentos

1 / 15

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Guardas y Tipos de datos
Taller de ´
Algebra I
1er Cuatrimestre 2017
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Taller de Algebra: Haskell y más Apuntes en PDF de Álgebra solo en Docsity!

Guardas y Tipos de datos

Taller de Algebra I´

1er Cuatrimestre 2017

Definiciones de funciones por casos

Podemos usar guardas para definir funciones por casos:

f (n) =

1 si n = 0

0 si no

f n | n == 0 = 1 | n /= 0 = 0

Palabra clave “si no”.

f n | n == 0 = 1 | otherwise = 0

¿Qu´e pasa si invertimos las guardas? ¿Por qu´e?

Presten atenci´on al orden de las guardas. ¡Cuando las condiciones se solapan, el orden

de las guardas cambia el comportamiento de la funci´on!

Tipos de datos

Tipo de dato

Un conjunto de valores a los que se les puede aplicar un conjunto de funciones.

Ejemplos

1 Integer = (Z, {+, −, ∗, div, mod}) es el tipo de datos que representa a los enteros con las operaciones aritm´eticas habituales. 2 Float = (Q∗, {+, −, ∗, /}) es el tipo de datos que “representa” a los racionales, con la aritm´etica de punto flotante. 3 Bool = ({True, False}, {&&, ||, not}) representa a los valores l´ogicos.

Dado un valor de un tipo de datos, solamente se pueden aplicar a ese valor las

operaciones definidas para ese tipo de datos.

Tipos de datos

En Haskell los tipos se notan con ::

Por ejemplo, en GHCI podemos ver el tipo del siguiente valor:

Prelude > : t True True :: Bool

A las expresiones tambi´en les corresponde un tipo de dato.

Prelude > : t 3 < 1 3 < 1 :: Bool

Tipar vs Evaluar

Dada una expresi´on, se puede determinar su tipo sin saber su valor.

Prelude > : t 4 ** 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 == 8 4 ** 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 == 8 :: Bool

Tipos de datos: Ejercicios

Tipar las siguientes funciones

doble :: ?? doble x = x + x

cuadruple :: ?? cuadruple x = doble ( doble x )

Tipar las siguientes expresiones

I (^) doble 10 I (^) dist (dist pi 0 pi 1) (doble 0) (doble 2) (3/4) Sabiendo que dist :: Float -> Float -> Float -> Float -> Float I (^) doble True

Implementar y tipar las siguientes funciones

I (^) esPar: dado un valor determina si es par o no. I (^) esCuadradoPerfecto: dado un valor determina si es un cuadrado perfecto.

Signatura

I (^) Es importante observar la signatura de las funciones en las definiciones anteriores. I (^) Especificamos expl´ıcitamente el tipo de datos del dominio y el codominio de las funciones que definimos.

1 No es estrictamente necesario especificarlo, dado que el mecanismo de inferencia de tipos de Haskell puede deducir la signatura m´as general para cada funci´on. 2 Sin embargo, es buena idea dar expl´ıcitamente la signatura de las funciones (¿por qu´e?).

Clases de tipos

¿La funci´on triple x = x * 3 admite cualquier tipo de datos?

¿Qu´e pasa con...? ¿funcionan?

I (^) triple 2 I (^) triple 2. I (^) triple True

: t triple triple :: Num a = > a -> a

¿Qu´e significa Num a => ...?

Lo que aparece antes del s´ımbolo => es la condici´on que debe cumplir la variable de tipo a.

La funci´on triple solo admite tipos de datos num´ericos.

Operaciones o funciones

Notaci´on infija

I (^) Hay muchas funciones predeterminadas por haskell.. entre ellas se encuentra el +. I (^) Pero.. si es una funci´on, ¿no deber´ıa escribirse + 2 3? I (^) No. El nombre real de la funci´on es (+); prueben (+) 2 3 I (^) Haskell permite definir funciones con s´ımbolos entre par´entesis, que despu´es pueden ser utilizados de manera infija sin los par´entesis I (^) Ejemplos: (+), (-), (==), (>), (<), (>=), (<=), (^), (*), (), etc.

¿Cu´al es la signatura de...?

I (>=)

I (==)

: t ( >=) ( >=) :: Ord a = > a -> a -> Bool

: t (==) (==) :: Eq a = > a -> a -> Bool

Tipos de datos: Tuplas

I (^) Dados dos tipos de datos A y B, tenemos el tipo de datos (A, B) que representa pares ordenados de elementos, donde el primero es de tipo A y el segundo es de tipo B.

I (^) Algunas funciones: I (^) fst :: (a, b) -> a I (^) Ejemplo de uso: fst (1 + 4, 2) 5

I (^) snd :: (a, b) -> b I (^) Ejemplo de uso: snd (1, (2, 3)) (2, 3) I (^) Ahora podemos definir la norma vectorial un poco m´as claramente:

normaVectorial :: ( Float , Float ) -> Float normaVectorial p = sqrt (( fst p ) ^ 2 + ( snd p ) ^ 2)

Nota:

I (^) Hay tuplas de distintos tama˜nos: (True, 1, 4.0), (0, 0, 0, 0).

Ejercicios

I (^) Implementar las siguientes funciones I (^) crearPar :: a -> b -> (a, b) que crea un par a partir de sus dos componentes. I (^) invertir :: (a, b) -> (b, a) que invierte el par pasado como par´ametro I (^) distancia :: (Float, Float) -> (Float, Float) -> Float que determina la distancia entre dos puntos.

Ejercicios

1 Implementar las siguientes funciones del Ejercicio 32 Pr´actica 1 (reemplazamos N por Z), usando tipo Integer para los n´umeros enteros y tipo Float para los n´umeros reales: I (^) f 1 : R → R^3 , f 1(x) = (2x, x^2 , x − 7)

I (^) f 2 : Z → Z, f 2(n) =

n 2 si^ n^ es par n + 1 si n es impar

y calcular f 1(3), f 1(

2), f 2(5), f 2(4), f 2(−10). ¿Qu´e sucede si queremos calcular f 2(

2 Implementar las funciones f y g del Ejercicio 33.i) Pr´actica 1:

f : Z → Z, f (n) =

n^2 2 si^ n^ es divisible por 6 3 n + 1 en los otros casos

g : Z × Z → Z, g (n, m) = n(m + 1) y calcular (f ◦ g )(3, 4), (f ◦ g )(2, 5). Implementar una funci´on h = (f ◦ g ) y calcular h(3, 2). ¿Cu´al es la signatura de h?