-- Ränge berechnen mittels Durchnumerieren und Herausstreichen zu niedriger Ränge rank = sortby name . assign . reverse . sortby mark where mark (xn,xm) = xm name (xn,xm,xr) = xn -- Ränge zuweisen assign :: [(Name,Mark)] -> Ranks assign xs = scanl1 reduce . initialise -- Ränge der Reihe nach initialisieren initialise :: [(Name,Mark)] -> Ranks initialise = zipWith mktriple xs [1..] where mktriple ((xn,xm),xr) = (xn,xm,xr) -- zu niedrige Ränge hochsetzen reduce (xn,xm,xr) (yn,ym,yr) = if ym == xm then (yn,ym,xr) else (yn,ym,yr)