Datos compuestos de Haskell como modelo de datos

From Ibbddunq

(Difference between revisions)

Revision as of 21:49, 2 January 2008

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 | 
       NoCurso Legajo Materia
       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 
       | null cp       = [NoCurso alumno materia]
       | otherwise     = cp
       where cp = 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
   
   aproboCursada (NoCurso _ _) = False 
   
   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
Personal tools