2012-03-22 108 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