Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche
Autor Mensaje
cuccoed Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 3
Agradecimientos dados: 0
Agradecimientos: 0 en 0 posts
Registro en: Sep 2013
Mensaje: #1
Rainbow [FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche Trabajo practico Paradigmas de Programación
Hola!! Estoy tratando de resolver un practico de la cátedra de los Miércoles[/code] y Jueves por la noche cuatrimestral.

8) Se quiere poder hacer las siguientes consultas a partir de un pasaje, que es una tupla con la clase de asiento y una lista de vuelos con escalas:
Precio total (suma de los precios de cada vuelo con esa clase de asiento)
Tiempo de combinación total (suma de las horas de diferencia entre vuelos)
Desarrollar una función sumatoriaDe/2, definir su tipo y usarla para resolver las consultas de los puntos a y b sin definir funciones auxiliares (de ser necesario puede usar expresiones lambda).
> sumatoriaDe (*2) [1,2,3]
12




type Vuelo = (Int,String,CiudadHorario,CiudadHorario,Double)
type CiudadHorario = (String,(Fecha,Hora))
type Fecha = (Integer,Int,Int)
type Hora = (Double, Double)

-- algunos vuelos para probar
lan4170 = (4170, "lan", ("buenos aires",((2013,12,24),(17,15))), ("londres",((2013,12,25),(5,15))), 4000) :: Vuelo
iberia5800 = (5800, "iberia", ("londres",((2013,12,25),(5,45))), ("barcelona",((2013,12,25),(6,55))), 500) :: Vuelo
iberia5801 = (5801, "iberia", ("londres",((2013,12,25),(7,00))), ("barcelona",((2013,12,25),(8,10))), 500) :: Vuelo
xM5801 = (5801, "iberia", ("londres",((2013,12,26),(7,00))), ("roma",((2013,12,26),(8,10))), 500) :: Vuelo

combinaciones [x] = []

combinaciones (x:xs) = (llegada x , salida (head xs)) :combinaciones xs
pasaje = (economica, [lan4170, iberia5801, xM5801])

-- combinaciones del pasaje = [(("londres",((2013,12,25),(5,15))),("londres",((2013,12,25),(7,0))))]

-- ACA EMPIEZA EL PUNTO 8.

tiempoCombinacion (asciento, vuelos) = sumaEntreVuelos(combinaciones vuelos)

sumaEntreVuelos [] = 0
sumaEntreVuelos (x:xs) = horasDeDiferencia ((snd.fst) x) ((snd.snd) x) + sumaEntreVuelos xs

sumatoriaDe :: Num c => (t -> a -> c) -> (t, [a]) -> c

sumatoriaDe fun (asciento, lista) = (sum.map(fun asciento)) lista



El tema que tengo que hacer 1 y solo una funcion que resuelva las 2 cosas, me dijeron que use foldl y lambdas, pero son todo un lado oscuro para mi las lambdas y el foldl en conjunto... me pierdo y mucho!!

Espero que alguno me pueda dar un puntapie y guiarme para poder resolver este punto!!

El link del tp: https://docs.google.com/document/d/1xz18...4BUZ0/edit

GRACIAS!!
(Este mensaje fue modificado por última vez en: 23-09-2013 17:52 por cuccoed.)
23-09-2013 17:48
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Desert69 Sin conexión
Presidente del CEIT
Sin estado :( / "Anarquia...
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 2.274
Agradecimientos dados: 149
Agradecimientos: 247 en 159 posts
Registro en: Jun 2008
Mensaje: #2
RE: [FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche
Ojo a piojo. Lo que te dicen es que hagas una función llamada sumatoriaDe, y que uses esa función para resolver esos dos pedidos que te hacen antes.

La idea es que sumatoriaDe tiene que ser lo suficientemente feliz para que puedas hacer la consulta de ejemplo que está ahí (sumatoriaDe (*2) [1, 2, 3]), y que esa misma función sumatoriaDe te sirva para calcular el tiempo total de combinaciones a partir de una lista de ¿vuelos?, y también para calcular el precio total de una lista de pasajes. Pero las tres cosas tienen que resolverse usando esa misma función sumatoriaDe, más otros agregados o cosas que necesites.

Es decir, en algún lugar harás algo como:

tiempoTotalDeCombinacion ????? = ???????? sumatoriaDe ???????????

precioPasajes ?????? = ??????? sumatoriaDe ?????????

Y así...


Lo ideal para esto es que, a partir de la invocación que tenés de ejemplo (la de los números con el *2) pienses el prototipo de tu función (es decir, qué parámetros espera y qué valores devuelve), y a partir de ahí la implementes. Si te sirve, pensá primero cómo la usarías para ese ejemplo puntual que tenés ahí, y, una vez que eso ande joya, extrapolá y tratá de generalizarla para que te sirva para los otros dos casos, sin romper los anteriores.


En cuanto a las expresiones lambda, no son mucho más que una función sin nombre: en lugar de definir algo como "elSiguienteDe unNumero = unNumero + 1", declarás la función sin darle nombre: (\ unNumero -> unNumero + 1)
Para [no mucha] más información, la wiki de Uqbar: http://uqbar-wiki.org/index.php?title=Ex...nes_lambda

Espero haberos iluminados =)

[Imagen: a2.php]
[Imagen: 971aa6599664453c05cb3e42d58bbc0eo.jpg]
24-09-2013 00:24
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
cuccoed Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 3
Agradecimientos dados: 0
Agradecimientos: 0 en 0 posts
Registro en: Sep 2013
Mensaje: #3
RE: [FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche
Gracias por la repuesta!

La verdad entiendo que quieren una sola función que haga todo, debería entonces entrar una función y una lista, y q la función haga una transformación a la lista para que sea una lista de números y se sumen todos..

El tema esta que no se como plantearlo o hacerlo. Me recomendaron foldl y funciones lambdas pero no, mi cabeza no lo puede imaginar..

En la parte de codigo que pegue sumatoriaDe recibe una función y una lista, y con map transforma y con sum suma la lista, pero no puedo aplicarlo para la parte de combinaciones, ya que reciben distintos tipos de datos o tuplas....

Por ejemplo, precio recibe un pasaje y un vuelo, entonces perfecto, funciona con sumotoriaDe. Pero combinaciones recibe una lista de vuelos (en vez de 2 parámetros) y devuelve una lista de horarios (tuplas de 2 elementos en una lista). Y yo esa lista recién la puedo transformar a una lista de Doubles con la función horasDeDiferencia.

Entonces ahí ya no se que hacer, y busco ejemplos similares y no encuentro.

sumatoriaDe fun lista = (sum.map(fun)) lista --> este funcionaria para sumotoriaDe (*2) [1,2,3,4]

Si alguno me puede acercar mas a lo que esta pidiendo la profesora agradezco!!

Gracias =)
24-09-2013 09:33
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Baron Bomadil Sin conexión
Militante
We are out of coffee
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 85
Agradecimientos dados: 17
Agradecimientos: 8 en 8 posts
Registro en: Jul 2013
Mensaje: #4
RE: [FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche
No entiendo mucho cuál es tu duda per se, no es mas facil dejar sumatoriaDe como


sumatoriaDe::Num a => (b->a) ->[b]->a
sumatoriaDe f_map lista = (sum.map) f_map lista


Así tenes una función genérica, después para los diferentes formatos de lista que tenés, la mapeás "antes" de pasarsela a sumatoriaDe ( en realidad ponés el mapeo en la misma consulta xD )
(Este mensaje fue modificado por última vez en: 24-09-2013 13:55 por Baron Bomadil.)
24-09-2013 13:55
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
cuccoed Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 3
Agradecimientos dados: 0
Agradecimientos: 0 en 0 posts
Registro en: Sep 2013
Mensaje: #5
RE: [FUNCIONAL] Ayuda punto del TP - Paradigmas Miercoles, Jueves por la noche
Mi ultimo avance solo para el precio total:

sumatoriaDe fun (asiento, vuelos)= foldl (+) 0 (map (fun asiento) vuelos)

Sito lo que me respondió la profe en un mail, la verdad me gustaría entrar en su cabeza para ver como lo piensa jajaja

Yo ya no se para donde disparar!!
Cita:Para la definición de sumatoriaDe no hace falta map, con foldl sólo sale!.

La definición de sumatoriaDe es única!!.. Lo que necesitas es aplicar la función sumatoriaDe para resolver lo pedido..

a. Precio total (suma de los precios de cada vuelo con esa clase de asiento)

sumatoriaDe (...algo....) snd pasaje

Necesitas pensar la función que sería el segundo argumento sumatoriDe.

Acá podés usar expresiónes lambda..también podés aplicar una función que ya este definida como precio..Lo que no podés es crear nuevas funciones axiliares..
24-09-2013 14:28
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.