UTNianos

Versión completa: [PdeP] Consulta Funcional
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola compañeros! Cómo están?

Estoy preparando paradigma funcional y estoy un poquito perdido ....
En un parcial está el siguiente enunciado:

De cada persona nos interesa saber su edad, su peso y su coeficiente de tonificación. Tenemos algunos ejemplos de socios para realizar las pruebas:

­­ (edad, peso, tonificacion) 

pancho = ( 40, 120, 1) 

andres = ( 22, 80, 6) 

 
Los ejercicios que se pueden hacer son funciones que dada una persona y una cantidad de minutos, 
retorna a la persona luego de realizar el ejercicio. Un ejemplo simple de ejercicio en el cual la persona no
hace nada (y por ende queda igual que al principio sin importar cuánto tiempo lo realice) podría ser: 
relax minutos persona = persona 

Se pide: 

1. Saber si alguien está saludable, lo cual se cumple si no está obeso y tiene una tonificación mayor a 5. Alguien es obeso si pesa más de 100 kilos. 

> saludable pancho  
False 
> saludable andres  
True

Lo que veo acá es que no le pasa una tupla como parámetro a la función, sino el nombre de la persona (que a su vez define una tupla). Yo lo definí de la siguiente manera:

saludable:: (Int,Int,Int) -> Bool
saludable (edad,peso,tonificacion) | (peso < 100 && tonificacion > 5) = True
| otherwise = False

Funciona 10 puntos, pero cómo puedo hacer para pasarle el nombre de la persona y no la tupla entera? Cómo debería definir el tipo, o bien, definir la tupla con el nombre pancho y andres?



Si alguien me puede dar una mano, agradecido!!!

Saludos!!
fijate si no podes usar data o type. alguna de las dos te tiene que servir

ej: data Persona = Persona .......

y despues haces

let pancho = Persona....
let andres = Persona...

y al final

> saludable pancho

creo que es algo asi, todavia tengo que repasar funcional

espero no haber tirado fruta.
Está bien como lo haces, digamos "pancho" o "andres" son funciones constantes (sí en funcional todo es una función genius), y la idea es que justamente vos lo hagas así, pasándole la tupla de esa forma, para comprobar que sabes el concepto de pattern matching. Porque también existe la posibilidad de definir funciones que te devuelvan la edad, ponele esta sería otra forma (HORRIBLE, aclaro por las dudas) de hacerlo:

obtenerPeso(_,p,_) = p
obtenerTonif(_,_,t) = t

saludable persona = (((<100).obtenerPeso) persona) && (((>5).obtenerTonif) persona)

Pero, de esta forma ni ves lo que es el concepto de pattern matching. Eso en cuanto a tu consulta, ahora una pequeña corrección; siempre que iguales algo a True o False, pensá que existe otra forma de hacerlo porque igual a true una claúsula que ya de por sí te devuelve True o False, es totalmente redundante. Te quedaría así:

saludable (edad,peso,tonificacion) = (peso < 100) && (tonificacion > 5)
Gracias.
URLs de referencia