Buenas! Les dejo el final de paradigmas, que rendí el día 24 de febrero.
Fue una meet de 20 minutos, con Nicolas Scarcella y Mariana Matos. Prepare el final viendo sus clases en youtube:
https://www.youtube.com/channel/UCKIxojO...Dwn3BpgNIQ
https://www.youtube.com/channel/UCUgdTN1...Cp7T8bnDFQ
Para cada paradigma, me mostraron un pedazo de código y me hicieron preguntas sobre eso. Les dejo los ejercicios como los recuerdo (puede que algo no sea tal cual)
OBJETOS
object tren {
const locomotoras = []
const vagones = []
method calcularPrecio {
const precioLocomotoras = sum ( locomotoras.map(locomotora => locomotora.precio()))
const precioVagones = sum ( vagones.map(vagon => vagon.precio()))
return precioLocomotoras + precioVagones
}
}
class Vagon {
const cantidadAsientos
method precio = 800*cantidadAsientos
}
class VagonElegante inherits Vagon {
const tieneAireAcondicionado
method precio = 800*cantidadAsientos*10 (aca habia algo mas pero no recuerdo)
}
1) ¿el metodo calcularPrecio, esta usando polimorfismo? En caso de que no ¿que cambios harías para que lo use?
no usa polimorfismo porque esta usando el objeto en concreto. Habria que hacer una lista tipo "partesDeTren" que agrupe locomotoras y los tipos de vagon, y luego hacer "parteDeTren.precio()" y ahi si se usaria polimorfismo.
2) ¿que pasa si se agrega un vagon furgon? si meto todo en una misma lista, no pasa nada, siempre que el objeto VagonFurgon sepa responder al mensaje "precio()"
3) ¿Esta bien la herencia entre vagon y vagonElegante? ¿Seria lo mismo que Vagon herede de VagonElegante?
Si, porque vagon elegante es una vagon mas especifico. No, por la misma justificacion de antes. VagonElegante es mas especifico.
4) ¿Que tiene de malo el metodo precio() en VagonElegante?
Aparentemente quiere usar el comportamiento de precio() de Vagon, y para eso repite el codigo. Habria que hacer un llamado a super().
5) ¿Que beneficio trae llamar a super?
Que si cambia la implementacion en la superclase, la subclase no se ve afectada.
FUNCIONAL
Daban un tipo de dato y dos funciones:
data Persona = Persona {
edad::Int
}
f1 p = any p . map edad
f2 p = (>0) . length . filter p . map edad
1) ¿que hace cada funcion?
Hacen lo mismo las dos: dada una lista de Personas, arma una lista de edades y dice si alguna cumple con cierta condicion.
2) ¿cual es mas declarativa?
f1. Porque tiene el any (alguno cumple?). f2 tiene mas "algoritmo": filtra tal cosa, calcula la longitud, fijate si es mayor a 0...
3) Dada esta aplicacion:
f1 (>30) [1, 2, 3, ...] ¿que devuelve? ¿termina o no termina?
devuelve true. termina porque la lista se recorre hasta que encuentra el primero que cumple con >30. Evaluacion diferida.
4) ¿y este? f2 (>0) [1, 2, 3, ...] (algo asi era...)
no termina, porque el length necesita tener la lista completa para calcular el tamaño.
LOGICO
Este punto no me lo acuerdo tanto, pero era algo asi:
tiene(Persona, Producto)
esCaro(Producto)
esDeCalidad(Producto)
laEngrupieron(Persona) :- forall( tiene(Persona, Producto), (esCaro(Producto), not(esDeCalidad(Producto))))
1) decir "en español" que hace el predicado laEngrupieron
a una persona la engrupieron si todos los productos que tiene son caros y no son de calidad.
2) ¿que devuelve la consulta laEngrupieron(UnaPersona)?
devuelve true, porque al no estar ligada la variable antes del forall, este no tiene la persona sobre la cual trabajar.
3) ¿como haces para que la respuesta sea del tipo UnaPersona=josesito?
hay que generar la variable antes del forall. puede ser con el predicado tiene:
laEngrupieron(Persona) :- tiene(Persona, _), forall( tiene(Persona, Producto), (esCaro(Producto), not(esDeCalidad(Producto))))
4) ¿que pasa si pongo el generador despues del forall?
va a funcionar igual que antes, porque prolog lee en el orden que le pones los predicados.
y eso fue todo.
Saludos!