introalg:taller09_3
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
introalg:taller09_3 [2009/04/13 13:08] – laura | introalg:taller09_3 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 173: | Línea 173: | ||
Haskell es un lenguaje tipado, es decir, todo dato pertenece a una clase o tipo de datos. En general, la definición de una función va precedida de su //signatura de tipos//, donde declaramos los tipos que están involucrados en la función: | Haskell es un lenguaje tipado, es decir, todo dato pertenece a una clase o tipo de datos. En general, la definición de una función va precedida de su //signatura de tipos//, donde declaramos los tipos que están involucrados en la función: | ||
< | < | ||
- | | + | sgn :: Int -> Int -- esta línea es la signatura de tipos de la función sgn |
- | sgn x | 0< | + | sgn x | 0< |
- | | x< | + | | x< |
- | | x==0 = 0 | + | | x==0 = 0 |
</ | </ | ||
La signatura de tipos está formada por el nombre de la función y el tipo de sus parámetros y resultado. El nombre va seguido de ''::'' | La signatura de tipos está formada por el nombre de la función y el tipo de sus parámetros y resultado. El nombre va seguido de ''::'' | ||
< | < | ||
- | | + | sgn :: Int -> Int |
- | reverse :: [a] -> [a] | + | reverse :: [a] -> [a] |
- | map :: (a -> b) -> [a] -> [b] | + | map :: (a -> b) -> [a] -> [b] |
</ | </ | ||
Pequeño ejercicio sobre la aridad((Recuerden que la aridad es el número de argumentos de la función: unaria si tiene un argumento, binaria si tiene dos, etc.)) de las funciones: cuál de estas tres funciones es unaria, cuál binaria, cuál ternaria? | Pequeño ejercicio sobre la aridad((Recuerden que la aridad es el número de argumentos de la función: unaria si tiene un argumento, binaria si tiene dos, etc.)) de las funciones: cuál de estas tres funciones es unaria, cuál binaria, cuál ternaria? | ||
Línea 238: | Línea 238: | ||
Veamos algunos ejemplos: | Veamos algunos ejemplos: | ||
< | < | ||
- | | + | suma3upla :: (Int, |
- | suma3upla (x,y,z) = x+y+z | + | suma3upla (x,y,z) = x+y+z |
- | + | </ | |
- | sumaYResta :: Int -> Int -> (Int,Int) | + | < |
- | sumaYResta x y = (x+y, x-y) | + | sumaYResta :: Int -> Int -> (Int,Int) |
+ | sumaYResta x y = (x+y, x-y) | ||
</ | </ | ||
Línea 269: | Línea 270: | ||
</ | </ | ||
- | Pero no sólo podemos distinguir el primer elemento de una lista, podemos distinguir //cualquier fracción inicial//. No podemos distinguir fracciones finales de las listas porque la estructura de tuplas requiere que para distinguir el //n+1// elemento de una tupla hayamos distinguido el elemento //n//. | + | Pero no sólo podemos distinguir el primer elemento de una lista, podemos distinguir //cualquier fracción inicial//. Cuando decimos que podemos distinguir cualquier fracción inicial de una lista, lo que queremos decir es que nos podemos referir al n-ésimo elemento de una lista, eso sí, para hacerlo tenemos que hacerlo con un patrón en el que se representen todos los elementos desde el primero hasta el n-1. Por ejemplo, si queremos referirnos al tercer elemento de una lista, tendremos que referirnos también al primero y al segundo, aunque sea mediante un patrón irrefutable, |
+ | < | ||
+ | tercero [a] -> a | ||
+ | tercero [_:_:x:_] = x | ||
+ | </ | ||
+ | |||
+ | Sin embargo, podemos dejar el resto de la lista sin detallar cuántos elementos hay. No podemos distinguir fracciones finales de las listas porque la estructura de tuplas requiere que para distinguir el //n+1// elemento de una tupla hayamos distinguido el elemento //n//. | ||
Definimos un predicado que decide si //hay 2 o más elementos en una lista//: | Definimos un predicado que decide si //hay 2 o más elementos en una lista//: | ||
Línea 418: | Línea 425: | ||
Hay muchos ejercicios para hacer, no se preocupen si no pueden terminarlos todos!! Vamos a ver algunos de ellos en la próxima clase para consolidar los conceptos que hemos visto en esta. | Hay muchos ejercicios para hacer, no se preocupen si no pueden terminarlos todos!! Vamos a ver algunos de ellos en la próxima clase para consolidar los conceptos que hemos visto en esta. | ||
- | * Definir una función //ordena.(x,y)//, //ordena : (Int,Int) -> (Int,Int)// que, dados dos enteros, los ordena de menor a mayor. | + | * Definir una función //ordena (x,y)//, // |
probar con (0,1), (2,2), (3,1). | probar con (0,1), (2,2), (3,1). | ||
- | * Definir una función // | + | * Definir una función // |
probar con 5 y 9, con -8 y 9, con -10 y -1, con 0 y 0 y con 0 y 3 | probar con 5 y 9, con -8 y 9, con -10 y -1, con 0 y 0 y con 0 y 3 | ||
* Ejercicio 8.7 del Apunte\\ | * Ejercicio 8.7 del Apunte\\ | ||
- | Definir la función //edad : (Int, Int, Int) -> (Int, Int, Int) -> Int// que dadas dos fechas indica los años transcurridos entre ellas. Por ejemplo edad.(20, | + | Definir la función // |
Suponer que las fechas están siempre bien formadas y que la primera es menor o igual a la segunda. | Suponer que las fechas están siempre bien formadas y que la primera es menor o igual a la segunda. | ||
Línea 436: | Línea 443: | ||
En un prisma rectangular, | En un prisma rectangular, | ||
la siguiente definición del área del prisma: \\ | la siguiente definición del área del prisma: \\ | ||
- | //area.h.b.d = 2 ∗ frente + 2 ∗ lado + 2 ∗ arriba// \\ | + | //area h b d = 2 ∗ frente + 2 ∗ lado + 2 ∗ arriba// \\ |
//|[ | //|[ | ||
donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente.\\ | donde //frente//, //lado// y //arriba// son las caras frontal, lateral y superior del prisma respectivamente.\\ | ||
- | Completar la función //area.h.b.d// //area : Int -> Int -> Int -> Int// que calcula el área de un prisma rectangular: | + | Completar la función //area h b d// // |
area :: Int -> Int -> Int -> Int | area :: Int -> Int -> Int -> Int | ||
- | area.h.b.d = 2*frente + 2*lado + 2*tapa | + | area h b d = 2*frente + 2*lado + 2*tapa |
where | where | ||
frente = ... | frente = ... | ||
Línea 451: | Línea 458: | ||
* Programar en haskell una [[http:// | * Programar en haskell una [[http:// | ||
- | * Definir la función //cabeza.xs//, //cabeza : [a] --> a//, que devuelve el primer elemento de una lista. | + | * Definir la función //cabeza xs//, // |
probar con [1,2,3], con [3,3,3] y con []. | probar con [1,2,3], con [3,3,3] y con []. | ||
- | * Definir la función //cola.xs//, //cola : [a] --> [a]//, que devuelve toda la lista menos el primer elemento. | + | * Definir la función //cola xs//, // |
probar con [1,2,3], con [3,3,3] y con []. | probar con [1,2,3], con [3,3,3] y con []. | ||
- | * Definir una función // | + | * Definir una función // |
probar con [1,2,3], con [3,3,3], con [0], con [0,1] y con []. | probar con [1,2,3], con [3,3,3], con [0], con [0,1] y con []. | ||
- | * Definir una función // | + | * Definir una función // |
probar con (1,2) y [3,2,4,5], (0,0) y [], (1,2) y [2,3,4,5]. | probar con (1,2) y [3,2,4,5], (0,0) y [], (1,2) y [2,3,4,5]. | ||
- | * Definir una función // | + | * Definir una función // |
Ayuda: fíjense que el resultado siempre debe ser una lista de caracteres! | Ayuda: fíjense que el resultado siempre debe ser una lista de caracteres! | ||
probar con [' | probar con [' | ||
- | * Definir una función // | + | * Definir una función // |
introalg/taller09_3.1239628093.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)