29-04-2014, 10:37
Buenas gente!
Estoy con un problema con unos ejercicios de Haskell, espero que alguno me pueda ayudar.
Es el punto 4:
Mi problema es que no se como pasarle una lista de funciones (rutinas) a una persona, mas aun cuando algunas de esas rutinas tienen argumentos adicionales (kilos, inclinacion, etc)
Dejo el enunciado adjunto como referencia.
Y acá esta lo que tengo hecho del TP hasta ahora:
Gracias!
Estoy con un problema con unos ejercicios de Haskell, espero que alguno me pueda ayudar.
Es el punto 4:
Cita:4. Rutina de ejercicios:
a. Dada una rutina (tupla con un nombre, duración total y lista de ejercicios específicos) y una
persona, obtener a la persona luego de realizar la rutina. La cantidad de minutos dedicada a
cada ejercicio es la misma.
Mostrar un ejemplo de uso usando todos los ejercicios del punto anterior.
Resolver de dos formas:
● Con recursividad
● Con fold
Mi problema es que no se como pasarle una lista de funciones (rutinas) a una persona, mas aun cuando algunas de esas rutinas tienen argumentos adicionales (kilos, inclinacion, etc)
Dejo el enunciado adjunto como referencia.
Y acá esta lo que tengo hecho del TP hasta ahora:
type Nombre = String
type Edad = Float
type Peso = Float
type Tonificacion = Float
data Persona = Socio Nombre Edad Peso Tonificacion deriving Show
ana = (Socio "ana" 25.0 50.0 6.0)
andres = (Socio "andres" 30.0 120.0 1.0)
pancho = (Socio "francisco" 40.0 120.0 1.0)
--1
saludable :: Persona -> Bool
saludable persona = not (obeso persona) && tonificacion persona > 5.0
--2
quemarCalorias :: Float -> Persona -> Persona
quemarCalorias calorias persona | obeso persona = bajarDePeso (calorias/150.0) persona
| edad persona > 30.0 && calorias > 200.0 = bajarDePeso 1 persona
| otherwise = bajarDePeso (calorias / (peso persona * edad persona)) persona
--3
caminataEnCinta :: Float -> Persona -> Persona
caminataEnCinta minutos persona = quemarCalorias (5.0 * minutos) persona
entrenamientoEnCinta :: Float -> Persona -> Persona
entrenamientoEnCinta minutos persona = quemarCalorias (velocidadPromedio minutos * minutos) persona
pesas :: Float -> Float -> Persona -> Persona
pesas minutos kilos persona | minutos > 10.0 = aumentarTonificacion (kilos / 10.0) persona
| otherwise = persona
colina :: Float -> Float -> Persona -> Persona
colina minutos inclinacion persona = quemarCalorias (2.0 * minutos * inclinacion) persona
montana :: Float -> Float -> Persona -> Persona
montana minutos inclinacion persona = ((colina (minutos/2.0) inclinacion).(colina (minutos/2.0) (inclinacion+3.0)).(aumentarTonificacion 1.0)) persona
{-
4a
aplicarRutina :: (String, Float, [(Float -> Persona -> Persona)]) -> Persona -> Persona
aplicarRutina (nombreRutina, duracionRutina, ejercicios) persona = map (ejercicios (duracionRutina/length ejercicios)) persona
rutina = [caminataEnCinta, entrenamientoEnCinta] --, pesas , colina, montana llevan argumento adicional
4b
type Resumen = (Nombre, Peso, Tonificacion)
resumenRutina :: Rutina -> Persona -> Resumen
resumenRutina =
5
rutinasSaludables :: [Rutina] -> [Rutina]
rutinasSaludables =
6
???
-}
--Funciones Auxiliares
nombre (Socio nombre _ _ _) = nombre
edad (Socio _ edad _ _) = edad
peso (Socio _ _ peso _) = peso
tonificacion (Socio _ _ _ tonificacion) = tonificacion
obeso persona = peso persona > 100.0
bajarDePeso cantidad (Socio nombre edad peso tonificacion) = (Socio nombre edad (peso-cantidad) tonificacion)
velocidadPromedio :: Float -> Float
velocidadPromedio minutos = (velocidadMinima + velocidadMaxima minutos) / 2.0
velocidadMinima :: Float
velocidadMinima = 6.0
velocidadMaxima :: Float -> Float
velocidadMaxima minutos = 6.0 + minutos / 5.0
aumentarTonificacion cantidad (Socio nombre edad peso tonificacion) = (Socio nombre edad peso (tonificacion+cantidad))
--Pruebas
{-
Main> saludable ana
True
Main> saludable andres
False
Main> quemarCalorias 300 pancho
Socio "francisco" 40.0 118.0 1.0
Main> caminataEnCinta 40 pancho
Socio "francisco" 40.0 118.6667 1.0
Main> entrenamientoEnCinta 40 pancho
Socio "francisco" 40.0 117.3333 1.0
Main> pesas 50 15 pancho
Socio "francisco" 40.0 120.0 2.5
Main> colina 5 40 pancho
Socio "francisco" 40.0 117.3333 1.0
Main> montana 5 40 pancho
Socio "francisco" 40.0 117.2333 2.0
-}
Gracias!