Guía programación funcional
Guía programación funcional
Los siguientes ejercicios deben ser pensados dentro del paradigma funcional. Pueden ser resueltos utilizando otros paradigmas pero el objetivo es el de lograr resolverlos utilizándolo, específicamente utilizando el lenguaje Scala. Para resolverlos se deben utilizar los conceptos y las herramientas vistas en clase, aunque puede ser necesario para resolverlos investigar otras herramientas por propia cuenta.
Ejercicios funciones impuras
Indicar y justificar cuales de las siguientes funciones son impuras
1.
def f ( x : Int , y : Int ) : Int = {
x + y
}
2.
def fecha () : String = {
LocalDate.now.format(DateTimeFormatter.ofPattern ("yyyyMMdd "))
}
3.
def contar(l: List[Int], e: Int): Int = {
var cont = 0;
l.foreach(elemento => {
if(elemento == e) {
cont = cont + 1
}
})
cont
}
4.
import scala.collection.mutable.Map
def actualizarAUno(mapa: Map[Int, Int]) = {
for (k, v) <- mapa do
mapa(k) = 1
}
5.
import scala.collection.mutable.Map
def randomEntre(a: Int, b: Int): Int = {
val rand = new scala.util.Random
rand.between(a, b)
}
6.
def merge[A](list1: List[A], list2: List[A]): List[A] = {
list1 ::: list2
}
7.
import java.io.PrintWriter
def guardarEnArchivo(texto: String, ruta: String): Unit = {
val escritor = new PrintWriter(ruta)
try {
escritor.write(texto)
} finally {
writer.close()
}
}
Ejercicios basicos
- Escribir una función
entreNumeros(inicio: Int, fin: Int): List[Int]que retorne una lista que incluya todos los números enteros entre inicio y fin incluyéndolos. - Escribir una función
repetidos(lista1: List[Int], lista2: List[Int]): List[Int]que retorne una nueva lista que contenga los elementos que están presentes en ambas listas. - Escribir una función
eliminarRepetidos(lista: List[Int]): List[Int]que retorne una nueva lista que contenga los mismos elementos que la original pero sin elementos repetidos. - Escribir una función
aplicar(lista: List[Int], f: (Int, Int)Int): List[Int]que retorne una nueva lista que contenga los resultados de aplicar f a cada elemento de lista. - Escribir una función
sumar(lista: List[Int]): Intque retorne la suma de todos los elementos de la lista. - Escribir una función
dobles(lista: List[Int]): List[Int]que retorne una nueva lista que contenga el doble de cada elemento. - Escribir una función
mayoresQue(lista: List[Int], n: Int): List[Int]que retorne una nueva lista que contenga únicamente los elementos mayores a n. - Escribir una función
longitudes(lista: List[String]): List[Int]que retorne una lista con la longitud de cada palabra.
Ejercicios intermedios
- Escribir una funcion
buscarElemento(lista: List[Int], elemento:Int): Booleanutilizandomatchque retornetruesi el elemento está presente en la lista, ofalseen caso contrario. - Escribir una función
filtrar(listas:List[List[Int]], n:Int): List[Int]que reciba una lista que contenga listas de enteros y un n, y filtre los números mayores a n. - Escribir una función que reciba un entero
ny una listaly retorne una lista con la diferencia de cada uno de la lista a n. Solo debe tener en cuenta los números para los cuales la diferencia es mayor a 10, ignorar el resto. - Definir la función
curry, que dada una función de dos argumentos, devuelve su equivalente currificada. - Definir la función
uncurry, que dada una función currificada de dos argumentos, devuelve su versión no currificada equivalente. Es la inversa de la anterior. - Escribir una función que reciba un string y retorna un booleano mostrando capicua o no, utilizando la función reverse y sin utilizarla.
- Escribir una función que retorne el n-esimo número de la sucesión de Fibonacci a partir de un número n.
- Escribir una función que retorne el máximo de una lista (no es valido usar la función reverse) utilizando
matchy luego sin utilizarlo. - Escribir una función
topK(numeros: List[Int], k: Int, f: (Int, Int) => Int): List[Int]que retorne una lista con loskelementos denúmerosmas grandes según la funciónf. La respuesta debe estar ordenada según el criterio de la funciónf.
Ejercicios avanzados
- Escribir una función
contar(palabras: List[String]): Map[String, Int]retorne un mapa donde las claves sean las palabras de la lista pasada por parámetro y los valores la cantidad de apariciones que tiene dicha palabra en la lista. - Dado un texto, crear una función que tome el texto como entrada y devuelva un mapa que muestre la frecuencia de cada palabra en el texto. Los espacios no deben ser considerados.
- Escribir una función que junte los números de una lista sin usar métodos de ordenamiento. Ej: (1, 2, 3,4, 1, 3) => (2, 1, 1, 3, 3, 4).
- Generar la lista de los primeros mil números primos.
Ejercicios case classes
- Modelar un Producto que tenga nombre y precio. Escribir una función que reciba una lista de productos y un n y filtre los productos con un precio menor a n.
- Modelar un punto en dos dimensiones (X,Y). Escribir una función que calcule la distancia entre dos puntos.
- Modelar un sistema de archivos donde hay ArchivoSimple y Carpeta (ambos son Archivos). El ArchivoSimple tiene nombre y tamaño y la Carpeta tiene nombre y una lista de Archivos.
- Escribir una funcion
tamañoTotal(archivo: Archivo): Intque calcule el tamaño total de todos los archivos simples contenidos. - Escribir una funcion
cantidadArchivos(archivo: Archivo): Intque calcule la cantidad de archivos simples que hay.
- Escribir una funcion