2012-03-22 7 views
3

私は2つの科目のためのマークを持つ学生という名前のカスタムデータ型を得ました。平均の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.私はハスケルの初心者で、それが 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

関連する問題