2012-03-22 4 views
3

2 개의 과목에 대해 자국이있는 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. 나는 하스켈에서 초보자이며 그 여부를 알지 못한다 inbuilt 평균 기능을하지만 만약 내가 비슷한 내 목록을 정렬 할 수 있습니다 선호 inbuilt 평균 기능 (없이)이 사용하는 것 없이이 작은 테스트 솔루션을 평균 대신에 다른 유형의 기능으로 사용하십시오.

답변

6
import Data.Function (on) 
import Data.List (sortBy) 

studentsSortedByAverage = sortBy (compare `on` average) students 

작은 따옴표가 아닌 on 주위의 역주입니다.

여기에 sortByon에 대한 문서 링크가 있습니다.


당신이 Data.Function와 함께 제공되지 않는 이전 컴파일러를 사용하는 경우가 여기에 on의 정의입니다 :

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c 
(.*.) `on` f = \x y -> f x .*. f y 
+0

안녕 데이브, 감사합니다 내가 말하는 오류 "수입 찾을 수 없습니다 모듈 Data.Function "어떤 단서를 시도했을 때 왜 그것을 어떻게 수정해야하는지. 당신의 도움을 간절히 바란다 –

+0

@Ranisha 최근 버전의 GHC를 사용하고 있다면 Data.Function이 있어야한다. 그러나 나는 on의 정의를 포함하도록 나의 대답을 편집했다. – dave4420