2012-03-22 94 views
3

我得到了一個名爲Student的自定義數據類型,其中有2個主題的標記。我創建了一個名爲average的函數來計算兩個函數的平均值。一切正常。Haskell數據類型排序列表

我的問題是如何根據他們的平均值排序學生列表?

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一個初學者,不知道它是否有一個內置 平均的功能,但我更喜歡,如果我不使用內置的平均函數(如果有),因爲這 小試,中分類我類似的 方式列表可以使用不同類型的功能 代替平均值。

回答

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「當我嘗試任何線索爲什麼如果是的話如何糾正它。感謝您的幫助 – 2012-03-22 09:23:36

+0

@Ranisha如果您正在使用最新版本的GHC,它應該帶有Data.Function,但我已經編輯了我的答案以包含'on'的定義。 – dave4420 2012-03-22 15:09:49