









Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Taller de Algebra: Haskell UBA
Tipo: Apuntes
1 / 15
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!










f n | n == 0 = 1 | n /= 0 = 0
f n | n == 0 = 1 | otherwise = 0
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.
Prelude > : t True True :: Bool
Prelude > : t 3 < 1 3 < 1 :: Bool
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
doble :: ?? doble x = x + x
cuadruple :: ?? cuadruple x = doble ( doble x )
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
I (^) esPar: dado un valor determina si es par o no. I (^) esCuadradoPerfecto: dado un valor determina si es un cuadrado perfecto.
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?).
I (^) triple 2 I (^) triple 2. I (^) triple True
: t triple triple :: Num a = > a -> a
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.
: t ( >=) ( >=) :: Ord a = > a -> a -> Bool
: t (==) (==) :: Eq a = > a -> a -> Bool
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)
I (^) Hay tuplas de distintos tama˜nos: (True, 1, 4.0), (0, 0, 0, 0).
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.
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?