Datos compuestos de Haskell como modelo de datos
From Ibbddunq
Este programa incluye una DB sobre notas de alumnos, tomando como modelo el sistema de tipos de Haskell. También incluye algunas consultas sobre la BD
data CursadaAlumno = Cursada Legajo Materia Cuatrimestre Nota deriving (Eq, Show) data ExamenIntegradorAlumno = ExamenIntegrador Legajo Materia Cuatrimestre Nota deriving (Eq, Show) data Alumno = Alumno Legajo Nombre Fecha deriving (Eq, Show) type Materia = String type Cuatrimestre = (Int,Int) type Nota = Int type Legajo = String type Nombre = String type Fecha = (Int, Int, Int) registroCursadas = [ Cursada "128/1" "Orga1" (2008,01) 9, Cursada "131/4" "Orga1" (2008,01) 5, Cursada "143/2" "IPr" (2008,01) 6, Cursada "201/9" "IPr" (2008,01) 8, Cursada "322/8" "IPr" (2008,01) 2, Cursada "128/1" "IPr" (2008,01) 6 ] registroExamenesIntegradores = [ ExamenIntegrador "143/2" "IPr" (2008,01) 5, ExamenIntegrador "128/1" "IPr" (2008,01) 2 ] alumnos = [ Alumno "143/2" "Juan Lopez" (23,2,1988), Alumno "201/9" "Roque Granata" (15,6,1981), Alumno "322/8" "Agustin Bal" (2,9,1984), Alumno "128/1" "Jose de Zer" (18,11,1977), Alumno "131/4" "Lucas E. Rito" (21,12,1987) ] nombre legajo = nombre' legajo alumnos nombre' legajo (Alumno leg nom _:resto) | leg == legajo = nom | otherwise = nombre' legajo resto aprobo alumno materia = aproboCursada alumno materia || aproboExamenIntegrador alumno materia aproboCursada alumno materia = aproboCursada' alumno materia registroCursadas aproboCursada' alumno materia [] = False aproboCursada' alumno materia (Cursada al mat _ nota:resto) | al == alumno && mat == materia && nota >= 7 = True | otherwise = aproboCursada' alumno materia resto aproboExamenIntegrador alumno materia = aproboExamenIntegrador' alumno materia registroExamenesIntegradores aproboExamenIntegrador' alumno materia [] = False aproboExamenIntegrador' alumno materia (ExamenIntegrador al mat _ nota:resto) | al == alumno && mat == materia && nota >= 4 = True | otherwise = aproboExamenIntegrador' alumno materia resto planillaCurso mat cuat = planillaCurso' mat cuat registroCursadas planillaCurso' mat cuat [] = [] planillaCurso' mat cuat (Cursada leg m c nota:resto) | mat == m && cuat == c = (nombre leg, nota):planillaCurso' mat cuat resto | otherwise = planillaCurso' mat cuat resto
Lo que sigue es una versión hecha con herramientas alternativas a la recursividad
data CursadaAlumno = Cursada Legajo Materia Cuatrimestre Nota deriving (Eq, Show) data ExamenIntegradorAlumno = ExamenIntegrador Legajo Materia Cuatrimestre Nota deriving (Eq, Show) data Alumno = Alumno Legajo Nombre Fecha deriving (Eq, Show) type Materia = String type Cuatrimestre = (Int,Int) type Nota = Int type Legajo = String type Nombre = String type Fecha = (Int, Int, Int) registroCursadas = [ Cursada "128/1" "Orga1" (2008,01) 9, Cursada "131/4" "Orga1" (2008,01) 5, Cursada "143/2" "IPr" (2008,01) 6, Cursada "201/9" "IPr" (2008,01) 8, Cursada "322/8" "IPr" (2008,01) 2, Cursada "128/1" "IPr" (2008,01) 6 ] registroExamenesIntegradores = [ ExamenIntegrador "143/2" "IPr" (2008,01) 5, ExamenIntegrador "128/1" "IPr" (2008,01) 2 ] alumnos = [ Alumno "143/2" "Juan Lopez" (23,2,1988), Alumno "201/9" "Roque Granata" (15,6,1981), Alumno "322/8" "Agustin Bal" (2,9,1984), Alumno "128/1" "Jose de Zer" (18,11,1977), Alumno "131/4" "Lucas E. Rito" (21,12,1987) ] nombre legajo = (nombreAlumno . head . (filter ((legajo ==).legajoAlumno))) alumnos nombreAlumno (Alumno _ nombre _) = nombre legajoAlumno (Alumno leg _ _) = leg cursadas alumno materia = filter (esCursada alumno materia) registroCursadas examenes alumno materia = filter (esExamen alumno materia) registroExamenesIntegradores esCursada alumno materia (Cursada al mat _ _) = alumno == al && materia == mat esExamen alumno materia (ExamenIntegrador al mat _ _) = alumno == al && materia == mat aprobo alumno materia = any aproboCursada (cursadas alumno materia) || any aproboExamenIntegrador (examenes alumno materia) aproboCursada (Cursada _ _ _ nota) = nota >= 7 aproboExamenIntegrador (ExamenIntegrador _ _ _ nota) = nota >= 4 planillaCurso materia cuatrimestre = [ (nombre leg, nota) | (Cursada leg _ _ nota) <- curso materia cuatrimestre ] curso materia cuatrimestre = filter esCurso registroCursadas where esCurso (Cursada _ mat cuat _) = mat == materia && cuat == cuatrimestre