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
[Paradigmas] Orden superior - Haskell
Autor Mensaje
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #1
[Paradigmas] Orden superior - Haskell Dudas y recomendaciones Paradigmas de Programación
Tengo una duda muy sarpada con el orden superior. Quiero comparar si ambas condiciones devuelven true con la misma lista (ej: ("Leonardo",[4,6,7,8])), por lo tanto supongo que deberia usar filter 2 veces. Primero para el nombre y luego para ver si tiene mas de 3 notas.
Pregunto porque estoy hace bastante con esto y no me cierra del todo. Si uso any directamente, seria erroneo. Tambien se que puedo usar composicion de funciones, en teoria, pero no me sale =(

Alguna ayuda? Estoy hasta las bolas y no encuentre algun tutoria/libro que diga que se sarpe explicando.

Saludos

Cita:Dadas las siguientes definiciones:

find f lista = head (filter f lista)

--Este es un curso a modo de ejemplo para que lo usen en sus pruebas
cursoK1024 = [("Leonardo",[4,6,7,8]),("Raphael",[1]),("Donatello",[10,10,10]),("Michelangelo",[4,4])]

Se quiere
Dado el nombre de una persona y un curso saber si esa persona es un alumno regular de dicho curso.
Esto se da si se cumplen las siguientes condiciones:
que esa persona sea un alumno del curso y
que haya rendido al menos 3 parciales

Main> esRegularEn cursoK1024 "Shredder"
False

Main> esRegularEn cursoK1024 "Raphael"
False

Main> esRegularEn cursoK1024 "Leonardo"
True


find f lista = head (filter f lista)
curso = [("Leonardo",[4,6,7,8];),("Raphael",[1];),("Donatello",[10,10,10];),("Michelangelo",[4,4];)]

sacarnombre(nombre,_) = nombre
sacarnotas(_,notas) = notas
nombres = map sacarnombre
notas = map sacarnotas

rendido lis = filter ((>=3).length.sacarnotas) lis
esta lis nom = filter ((==nom).sacarnombre) lis

14-04-2012 22:25
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dem0 Sin conexión
( ͡° ͜ʖ ͡°)
._.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.984
Agradecimientos dados: 9
Agradecimientos: 148 en 64 posts
Registro en: Apr 2008
Mensaje: #2
RE: [Paradigmas] Orden superior - Haskell
Mi haskell está un poco oxidado, pero:


esRegularEn c n = not (null (filter (\x -> length (snd x) <= 3 && (fst x) == n) c))


El filter


filter (\x -> length (snd x) <= 3 && (fst x) == n) c


te filtra todos los alumnos del curso c cuyo nombre sea n y su cantidad de notas sea <= 3. Podés probarlo por separado, reemplazando c por la lista del curso y n por un nombre de alumno.

El null recibe como parametro una lista y te dice si está vacía.
El not invierte el valor booleano, porque a vos te interesa saber si el alumno es regular, o sea, si la lista retornada por el filter tiene elementos.

Ojalá te sirva.

Saludos
(Este mensaje fue modificado por última vez en: 15-04-2012 00:02 por Dem0.)
15-04-2012 00:01
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #3
RE: [Paradigmas] Orden superior - Haskell
Muchas gracias por tu tiempo, me sirvio para pensarlo de otra manera =D Pero tengo problema cuando recibo la lista vacia Confused Intente poner un not(null [])) pero es muy villa jaja Te dejo el codigo y en que consulta tendria error


curso = [("Leonardo",[4,6,7,8];),("Raphael",[1];),("Donatello",[10,10,10];),("Michelangelo",[4,4];)]
find f lista = head (filter f lista)
sacarnombre(nombre,_) = nombre
sacarnotas(_,notas) = notas
esRegularEn lista nombre = ((>=3).length.sacarnotas) (find ((nombre==).sacarnombre) lista)


Cita:esRegularEn curso "Shredder"
Program error: pattern match failure: head

Se me complica usar esa funcion porque me devuelve una lista si o si y me la pide para el tp Confused

Gracias =D
16-04-2012 00:55
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
brunodiaz Sin conexión
The Dark Knight
Bla
**********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 7.762
Agradecimientos dados: 136
Agradecimientos: 381 en 132 posts
Registro en: May 2008
Mensaje: #4
RE: [Paradigmas] Orden superior - Haskell
PRometo qu epronto viene el resaltado de codigo y el compilador en haskell
(Este mensaje fue modificado por última vez en: 16-04-2012 01:06 por brunodiaz.)
16-04-2012 01:05
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dem0 Sin conexión
( ͡° ͜ʖ ͡°)
._.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.984
Agradecimientos dados: 9
Agradecimientos: 148 en 64 posts
Registro en: Apr 2008
Mensaje: #5
RE: [Paradigmas] Orden superior - Haskell
jaja, buenísimo.

@Niko: El problema es para aplicar head necesitas de una lista con elementos. Con esa implementación de la función find si le "metes" una lista vacía, o el filter te filtra todos los elementos de la lista, te va a dar ese error. No veo como escaparle.
16-04-2012 04:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #6
RE: [Paradigmas] Orden superior - Haskell
Al final entregue el TP 'asi nomas' (Con el error del pattern match) y me lo dieron como aprobado jajaja. Posiblemente pueda utilizar listas por comprensión para solucionarlo, pero ya fue.

Pueden cerrar el topic
17-04-2012 18:47
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dem0 Sin conexión
( ͡° ͜ʖ ͡°)
._.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.984
Agradecimientos dados: 9
Agradecimientos: 148 en 64 posts
Registro en: Apr 2008
Mensaje: #7
RE: [Paradigmas] Orden superior - Haskell
joya
17-04-2012 22:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
dezine18 Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 52
Agradecimientos dados: 1
Agradecimientos: 38 en 20 posts
Registro en: Oct 2008
Mensaje: #8
RE: [Paradigmas] Orden superior - Haskell
Te lo dieron como aprobado, porque no importa si tira error (esta bien que falle cuando el find no encuentra un elemento) , ya que el manejo de errores no es parte de la materia.
17-04-2012 23:58
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #9
RE: [Paradigmas] Orden superior - Haskell
Claro, mi idea seria fixearlo con una especie de IF. Pero es algo que no vimos todavia =P
18-04-2012 09:35
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rld Sin conexión
Secretario General
ლ(ಠ益ಠლ)
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 787
Agradecimientos dados: 9
Agradecimientos: 10 en 9 posts
Registro en: Nov 2010
Mensaje: #10
RE: [Paradigmas] Orden superior - Haskell
No sé si te hacen usar si o si el find, pero se me ocurrió hacerlo así:


type Alumno = (String, [Integer])

esRegularEn :: [Alumno] -> String -> Bool
esRegularEn curso nombre = not $ null [al | al <- curso, (fst al) == nombre, length (snd al) >= 3]



La idea es buscar los alumnos que coincidan con ese nombre y ver si hubo al menos uno (si hay dos con el mismo nombre, uno desaprobado y uno aprobado va a devolver True, aunque se podría usar not $ null head [..] para fijarse nada mas el primero)

ρλδ
(Este mensaje fue modificado por última vez en: 18-04-2012 17:45 por rld.)
18-04-2012 17:44
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.