CRUD Haskell

14 views
Skip to first unread message

Antonio Avilez

unread,
Dec 10, 2014, 9:15:34 PM12/10/14
to hskg...@googlegroups.com
Buen dia a todos, estoy aprendiendo haskell y quiero desarrollar una aplicacion CRUD, de momento no me interesa guardar la informacion en algun lugar simplemente emular ese funcionamiento en tiempo de ejecucion, sin importar que al final toda la data se pierda.

Comense por diseñar una tupla que guarda los datos de un alumno y cree una lista de este mismo tipo, tambien tengo un menu que utilizo para que el usario pueda interactuar con el programa pero, cuando intento agregar un nuevo registro al sistema tengo problemas con las conversiones de tipos, tambien me gustaria si me pueden decir como puedo eliminar un dato de una lista.

Muestro los fragmentos que llevo hasta el momento como podran darse cuenta son un novato en esto, apenas tengo 3 dias en ello.

Muchas gracias por su antencion buen dia.

import System.IO
import System.Exit
import Control.Monad
import DataBase
main = do forever (printMenu >> readChoice >>= menuAction)
printMenu = putStr "1.-Lista de alumnos \n2.-Lista de alumnos por promedio \n3.-Buscar \n4.-Agregar \n5.-Eliminar \n6.-Salir \nDigita tu opcion: ">> hFlush stdout
readChoice = getLine
menuAction "1" = print alumno
menuAction "2" = print promedios
menuAction "3" = print "En construccion"
menuAction "4" = print "En construccion"
menuAction "5" = print "En construccion"
menuAction "6" = exitSuccess
menuAction _ = return ()





module DataBase where

alumno = [ (10320834,"ATILANO GARCIA JESUS",23,100,15,28,100),
(10320860,"BARRERA DOMINGUEZ STEPHANY",16,98,30,98,30),
(10320890,"BAUTISTA LOPEZ ELVIS JOSUE",17,96,32,96,32),
(11320515,"BANIOS LAREDO JONATHAN ABIEL",18,94,34,94,34),
(10320944,"CAMACHO CAMPUZANO JORDAN",19,92,36,92,36),
(10320833,"CARRILLO LUNA JOEL",20,90,38,90,38),
(10320817,"CASTRO SANTOS EDUARDO",21,88,40,88,40),
(10320793,"CUEVAS BRAVO ALFONSO",22,86,42,86,42),
(11320191,"DE JESUS FACUNDO CARLOS ALFREDO",23,84,44,84,44),
(10320893,"DIAZ GUERRERO CHRISTIAN DANIEL",24,82,46,82,46),
(11320183,"DILLANES MARROQUIN ANA KAREN",25,80,48,80,48),
(11320554,"GARCIA ALQUISIRAS OSCAR ANDRES",26,78,50,78,50),
(11320559,"GARCIA MAZON ALEJANDRO",27,76,52,76,52),
(10320891,"GARCIA MONTERO OLIVER",28,74,54,74,54),
(10320947,"GERVACIO HERNANDEZ SILVIA CINSAI",29,72,56,85,56),
(10320123,"GONZALEZ MORALES INGRID CITLALLI",30,70,58,70,58),
(10530316,"GORJON MARTINEZ SIXTO ADOLFO",31,68,60,68,60),
(11320578,"HERNANDEZ HERNANDEZ JOSE MANUEL",32,66,62,66,62),
(10320804,"HUERTAS CUEVAS RIGOBERTO",33,64,64,64,64),
(11320198,"IGNACIO ARELLANES MIGUEL ANGEL",34,62,66,62,66),
(10320139,"MACEIRA TERESA GABRIEL",35,60,68,60,68),
(10320145,"MENDOZA RIVAS RICARDO AGUSTIN",36,58,70,58,70),
(10320885,"MERLAN AVILES EDWIN DE JESUS",37,56,72,56,72),
(10320984,"MUNIOZ CONTRERAS HUGO YERIT",38,54,74,54,74),
(11320156,"ORTEGA ZUNIGA YOLANDA OMELI",39,52,76,52,76),
(10320152,"PACHECO MEJIA BRIANDA YANET",40,50,78,50,78),
(10320159,"PEREZ PRUDENTE LORENA",41,48,80,48,80),
(10320161,"PONCE CASTRO ADRIANA",42,46,82,46,82),
(10320164,"RAYON RODRIGUEZ DAYSI CRISTAL",43,44,84,44,84),
(10320794,"RIOS GALEANA JOEL ENRIQUE",44,42,86,42,86),
(11320644,"ROCHA PEREZ CESAR",45,40,88,40,88),
(10320171,"SALGADO MARTINEZ GUSTAVO",46,38,90,38,90),
(10320861,"SALINAS PACHECO ISABEL ALEJANDRA",47,36,92,36,92),
(10320915,"SANCHEZ APARICIO LUIS ALBERTO",48,34,94,34,94),
(11320214,"SOLANO MARTINEZ DANIEL",49,32,96,32,96),
(11320689,"VERA CARVAJAL JOSE JUNIOR",50,30,98,30,98)]

query_1 = [ (no_Control) | (no_Control, nombre, _, _, _, _, _) <- alumno]

query_2 = [nombre | (_, nombre, _, _, _, u3, _) <- alumno, u3 > 70]

query_3 = [(nombre, edad) | (_, nombre, edad, _, _, u3, _) <- alumno, u3 > 70]

promedios = [ (nombre, ((u1+u2+u3+u4)/4)) | (_, nombre, _, u1, u2, u3, u4) <- alumno]

claves = [ (no_Control, nombre) | (no_Control, nombre, _, _, _, _, _) <- alumno]



module BuscarAlg where
import DataBase
findKey :: (Eq k) => k -> [(k,v)] -> Maybe v
findKey key = foldr (\(k,v) acc -> if key == k then Just v else acc) Nothing

Daniel Gray

unread,
Dec 11, 2014, 6:46:16 AM12/11/14
to hskg...@googlegroups.com

Hola. Te dare ni opinion personal, por favor tómala como tal :) es nada más una sugerencia.

Para aprender Haskell, necesitas afrontarlo de un modo distinto a otro lenguaje, porque es un paradigma de programacion miy diferente.

La base consiste en que ya no se considera el estado dentro de (gran parte de) un programa. El concepto de una "variable" en el sentido común, ya no existe.   Por tu pregunta, "como quitar una tupla de la lista previamente definida" sospecho que aun no has internalizado bien el concepto subyacente de la programación funcional, que en su estado puro, es la ausencia de estado (que es basicamente, que el estado de algo definido y colocado en memoria no puede cambiar).

No es algo para avergonzarse desde ningún punto de vista, porque todos hemos estado en ese estado en algun punto de nuestra vida.  :) es algo doloroso "romper" la mente para encajar esto de la prog. funcional, pero vale la pena!! :)

Te recomiendo que busques algún tutorial (uno muy bueno que recuerdo en ingles es "Learn you a Haskell for a great good") para internalizar bien los conceptos de inmutabilidad y determinismo matemático.

Hacer algo remotamente parecido a un CRUD involucra abstracciones más avanzadas por lo que considero que no es el mejor lugar para empezar con este lenguaje/paradigma.

Saludos!!
Daniel

--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad Haskell San Simon" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a hskgroup+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a hskg...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/hskgroup.
Para obtener más opciones, visita https://groups.google.com/d/optout.

Juan Jose Olivera

unread,
Dec 11, 2014, 6:50:40 AM12/11/14
to hskg...@googlegroups.com

Lo mas sencilli por el momento para tener algo similar a lo que quieres es que cuando agregues es crear una nueva lista que tenga los anteriores elementos mas el nuevo de similar forma para eliminar

carlos gomez

unread,
Dec 11, 2014, 9:54:25 AM12/11/14
to Comunidad Haskell San Simon, jose.anto...@gmail.com
Hola Antonio,

gracias por usar la lista, es bueno tener un poco de actividad después de tanto tiempo.

Desde el punto de vista de mantener lo que tienes, para el problema de tipos podrías usar la notación de 2 puntos para definir el tipo, por ejemplo, para insertar un número Int en vez de un Integer haces esto:
        suma2048 x = let miNumero = (2048)::Int
                              in x + miNumero
Por otro lado, esto del problema de tipos es común cuando Haskell no puede determinar que tipo usar, y eso se puede resolver de otras formas también: asignado tipos a la función, definiendo tipos explícitos (::) , no recuerdo otras.
Para el caso eliminar un elemento de la lista podrías usar la función "delete" de Data.List, y seguro que encontraras otras funciones útiles en esa librería. Por cierto, necesitarás que tu tupla sepa compararse con otras tuplas, aunque creo que eso ya viene por defecto.

Queriendo cambiar un poco lo que tienes, quizás sea mejor usar un Data.Map para la lista, ahí tendrías un ID y un Valor, y definir como un DataType el Valor, y luego definir operaciones sobre eso.

Saludos,
Carlos

Para publicar en este grupo, envía un correo electrónico a hskg...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages