Через несколько часов я справился с беспорядком: с помощью Великобритании (Джулиан Портер: www.jpembedded.co.uk, www.porternet.org).Есть способ не создавать монады или модифицировать классы (я еще не на этом уровне):
import Data.List
type NombreJug = String
type NombrePart = String
type Club = String
type Posicion = String
type Cotizacion = Integer
type PuntosLogrados = Integer
type MinutosJugados = Integer
type Jugador = (NombreJug,Club,Posicion,Cotizacion)
type Jugadores = [Jugador]
type PartConSusJug = (NombrePart,[NombreJug])
type Participantes = [PartConSusJug]
type Fecha = [(NombreJug,PuntosLogrados,MinutosJugados)]
type Fechas = [Fecha]
participantes = [("Natalia", ["Abbondazieri","Lluy","Battaglia", "Lazzaro"]),
("Romina", ["Islas", "Lluy", "Battaglia", "Lazzaro"]),
("Jessica", ["Islas"])
]
clubes = ["Boca", "Racing", "Tigre"]
jugadores = [("Abbondazieri", "Boca", "Arquero", 6500000),
("Islas", "Tigre", "Arquero", 5500000),
("Lluy", "Racing", "Defensor", 1800000),
("Battaglia", "Boca", "Volante", 8000000),
("Lazzaro", "Tigre", "Delantero", 5200000),
("Monzon","Boca","Defensor",3500000),
("Guzman","Newells","Arquero",1000000),
("Diaz","Velez","Defensor",3600000),
("Palermo","Boca","Delantero",12000000),
("Aguirre","Lanus","Volante",4500000),
("Cura","Huracan","Defensor",1700000),
("Espinoza","Gimnasia","Volante",300000),
("Clemente","Deportivo Piraña","Volante",60000000)
]
miListaTuplasFechas = [("quinta",[("Lluy", 8, 90),("Lazzaro", 6, 90)]),("sexta",[("Lazzaro", 7, 77),("Islas", 6, 90),("Lluy", 7, 90)]),("septima",[("Battaglia", 13, 90), ("Lluy", 6, 90), ("Lazzaro", 8, 77)]),("octava",[("Islas", 4, 84), ("Battaglia", 8, 90)])]
fechas = [quinta, sexta, septima, octava]
quinta = [("Lluy", 8, 90), ("Lazzaro", 6, 90)]
sexta = [("Lazzaro", 7, 77), ("Islas", 6, 90), ("Lluy", 7, 90)]
septima = [("Battaglia", 13, 90), ("Lluy", 6, 90), ("Lazzaro", 8, 77)]
octava = [("Islas", 4, 84), ("Battaglia", 8, 90)]
-- 10) mejorJugadorPor, recibe un criterio y devuelve el mejor jugador de acuerdo a ese criterio.
-- Dar además ejemplos de consultas que resuelvan los siguientes requerimientos:
mayorTupla (n1, c1) (n2, c2)
| c1 > c2 = GT
| c1 <= c2 = LT
-- 1.el jugador que logro mayor cantidad de puntos en todo el torneo. -> "Lazzaro"
armarListaDeTuplasPuntos::Jugadores->[(NombreJug,PuntosLogrados)]
armarListaDeTuplasPuntos [] = []
armarListaDeTuplasPuntos (ej:ejs) = [ (((\ (nombre,_,_,_)-> nombre) ej), (totalPuntosJugador ((\ (nombre,_,_,_)-> nombre) ej))) ] ++ armarListaDeTuplasPuntos ejs
mostrarmeLasTuplasPuntos = armarListaDeTuplasPuntos jugadores
jugadorConMayorCantidadDePuntosEnTorneo = (\ (nombre,puntos)->nombre) (maximumBy mayorTupla mostrarmeLasTuplasPuntos)
-- 2.el jugador que posee la mayor cotización.-> "Battaglia"
armarListaDeTuplasCotizacion::Jugadores->[(NombreJug,Cotizacion)]
armarListaDeTuplasCotizacion [] = []
armarListaDeTuplasCotizacion (ej:ejs) = [((\ (nombre,_,_,cotizacion)-> (nombre,cotizacion)) ej)] ++ armarListaDeTuplasCotizacion ejs
mostrarmeLasTuplasCotizaciones = armarListaDeTuplasCotizacion jugadores
jugadorConLaMayorCotizacion = (\ (nombre,cotizacion)->nombre) (maximumBy mayorTupla mostrarmeLasTuplasCotizaciones)
--Aquí se ve un ejemplo de aplicación de orden superior: la función maximumBy recibe dos funciones como agumentos.
-- 3.el jugador que logro mayor cantidad de puntos en una fecha. (en la 5º) -> "Lluy"
armarListaDeTuplasPuntosFecha::Fecha->[(NombreJug,PuntosLogrados)]
armarListaDeTuplasPuntosFecha [] = []
armarListaDeTuplasPuntosFecha (ej:ejs) = [((\ (nombre,puntos,_)-> (nombre,puntos)) ej)] ++ armarListaDeTuplasPuntosFecha ejs
jugadorConMayorCantidadDePuntoEnFecha [] = "Fecha no definida"
jugadorConMayorCantidadDePuntoEnFecha unaFecha = (\ (nombre,puntos)->nombre) (maximumBy mayorTupla (armarListaDeTuplasPuntosFecha unaFecha))
-- 4.el jugador que logro el mejor promedio en todo el torneo. -> "Battaglia"
armarListaDeTuplasPromedios::Jugadores->[(NombreJug,Float)]
armarListaDeTuplasPromedios [] = []
armarListaDeTuplasPromedios (ej:ejs) = [ (((\ (nombre,_,_,_)-> nombre) ej), (promedioPuntosJugador ((\ (nombre,_,_,_)-> nombre) ej))) ] ++ armarListaDeTuplasPromedios ejs
mostrarmeLasTuplasPromedios = armarListaDeTuplasPromedios jugadores
jugadorConMejorPromedioDelTorneo = (\ (nombre,puntos)->nombre) (maximumBy mayorTupla mostrarmeLasTuplasPromedios)
--Aquí se ve un ejemplo de aplicación de orden superior: la función mostrarmeLasTuplasPromerios es pasada como parámetro a la expresión lambda.
otroCaso = "No es un criterio valido, reintente una proxima vez"
listaDeCriterios criterio | (criterio == "jugadorConMayorCantidadDePuntosEnTorneo") = jugadorConMayorCantidadDePuntosEnTorneo
| (criterio == "jugadorConLaMayorCotizacion") = jugadorConLaMayorCotizacion
| (criterio == "jugadorConMejorPromedioDelTorneo") = jugadorConMejorPromedioDelTorneo
| ((criterio /= "jugadorConMayorCantidadDePuntosEnTorneo")&& (criterio /= "jugadorConLaMayorCotizacion")&&(criterio /= "jugadorConMejorPromedioDelTorneo")) = otroCaso
devolverFecha::String->[(String,Fecha)]->Fecha
devolverFecha laFecha [] = []
devolverFecha laFecha (f:fs) | (((\ fechaIngresada (fechaAComparar,_)-> fechaIngresada == fechaAComparar) laFecha f) == True) = snd f
| otherwise = devolverFecha laFecha fs
criterios1 = do
putStrLn "Ingrese la fecha deseada: "
x<-getLine
let resultado = ((jugadorConMayorCantidadDePuntoEnFecha (devolverFecha x miListaTuplasFechas)))
putStrLn ("\""++resultado++"\"")
criterios2::String->IO ()
criterios2 criterio = do
let resultado = (listaDeCriterios criterio)
putStrLn ("\""++resultado++"\"")
eleccionDeCriterios criterioElegido | (criterioElegido == "jugadorConMayorCantidadDePuntoEnFecha") = criterios1
| otherwise = criterios2 criterioElegido
mejorJugadorPor = do
putStrLn "Por favor, ingrese un criterio: "
criterio<-getLine
eleccionDeCriterios criterio
Вывод на консоль:
Main> mejorJugadorPor
Por favor, ingrese un criterio:
jugadorConMejorPromedioDelTorneo
"Battaglia"
Main> mejorJugadorPor
Por favor, ingrese un criterio:
pepe
"No es un criterio valido, reintente una proxima vez"
Main>
Main>
Main> mejorJugadorPor
Por favor, ingrese un criterio:
jugadorConMayorCantidadDePuntoEnFecha
Ingrese la fecha deseada:
quinta
"Lluy"
Main> mejorJugadorPor
Por favor, ingrese un criterio:
jugadorConMayorCantidadDePuntoEnFecha
Ingrese la fecha deseada:
decima
"Fecha no definida"
Это на испанском языке.Если кто-то найдет это полезным, свяжитесь со мной, и я переведу его на английский.
Большое спасибо тем, кто прокомментировал этот вопрос, и за их рекомендации.