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
