Haskell Список типов данных Сортировка - PullRequest
3 голосов
/ 22 марта 2012

Я получил пользовательский тип данных с именем Student, который имеет оценки по 2 предметам. Я создал функцию с именем Average, которая вычисляет среднее из двух. Все отлично работает.

У меня вопрос, как я могу отсортировать список студентов по среднему?

data Student = Student
    {studentName :: String,
     subject1 :: Double,
     subject2 :: Double} deriving (Show)

average :: Student -> Double
average (Student _ sub1 sub2) = (sub1 + sub2) / 2

students :: [Student]
students = [Student "Dave"  50.0  40.0,
            Student "Joe"   65.0  90.0,
            Student "Ann"   75.0  82.0]

P.S. Я новичок в Haskell и не знаю, получил ли он встроенная функция усреднения, но я предпочитаю сортировать свой список по аналогии способ без использования встроенной средней функции (если она есть), как это небольшое тестовое решение для использования с другим типом функции вместо среднего.

1 Ответ

6 голосов
/ 22 марта 2012
import Data.Function (on)
import Data.List (sortBy)

studentsSortedByAverage = sortBy (compare `on` average) students

Обратите внимание, что это обратные кавычки вокруг on, а не одинарные кавычки.

Здесь приведены ссылки на документы для sortBy и on.


Если вы используете старый компилятор, который не поставляется с Data.Function, вот определение on:

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
(.*.) `on` f = \x y -> f x .*. f y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...