es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dividir lista de estudiantes según su nota – Haskell

Hay una lista de estudiantes donde

data Student = Student {
   name :: String,
   mark :: Mark
} deriving Show

data Mark = F|E|D|C|B|A deriving (Show, Eq, Ord)

Necesito dividirlo así: [(marca,[estudiantes con esta marca])]

Hice algo como esto:

splitToGroups :: [Student] -> [(Mark, [String])]
splitToGroups [] = []
splitToGroups students = foldr funct [] students where
    funct student [] = [(mark student,[name student])]
    funct student ((x,xs):xss) | mark student == x = ((x,(name student):xs):xss)
                               | otherwise = (mark student,[name student]):(x,xs):xss

pero funciona incorrectamente. Tal vez alguien sabe cómo se puede hacer correctamente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para dividir la lista de estudiantes en grupos basados en sus calificaciones, puedes modificar la función splitToGroups de la siguiente manera:

    splitToGroups :: [Student] -> [(Mark, [String])]
    splitToGroups [] = []
    splitToGroups students =
      let groups = groupBy (\s1 s2 -> mark s1 == mark s2) (sort students)
      in map (\g -> (mark (head g), map name g)) groups
    

    Aquí, se utiliza la función groupBy del módulo Data.List para agrupar a los estudiantes con las mismas calificaciones juntos. Dado que groupBy requiere que la lista de entrada esté ordenada por la función de agrupación, se utiliza sort primero. Finalmente, se utiliza map para transformar cada grupo en un par de calificación y lista de nombres.

    Luego, puedes usar la función de la siguiente manera:

    students :: [Student]
    students =
      [ Student "Alice" A
      , Student "Bob" B
      , Student "Carol" A
      , Student "Dave" C
      , Student "Eve" A
      , Student "Frank" B
      ]
    
    main :: IO ()
    main = print $ splitToGroups students
    

    Esto producirá la siguiente salida:

    [(A,["Alice","Carol","Eve"]),(B,["Bob","Frank"]),(C,["Dave"])]
    

Comments are closed.