【问题标题】:Haskell List of Data Type SortingHaskell 数据类型排序列表
【发布时间】:2012-04-06 13:31:53
【问题描述】:

我有一个名为 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]

附:我是 Haskell 的初学者,不知道它是否有 内置平均功能,但如果我可以对我的列表进行类似的排序,我更喜欢 不使用内置平均函数(如果有的话)的方式 用于不同类型功能的小型测试解决方案 取而代之的是平均水平。

【问题讨论】:

    标签: list sorting haskell types


    【解决方案1】:
    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
    

    【讨论】:

    • 嗨,戴夫,谢谢,当我尝试任何线索为什么以及如何纠正它时,我收到一条错误消息“找不到导入的模块 Data.Function”。感谢您的帮助
    • @Ranisha 如果您使用的是最新版本的 GHC,它应该带有 Data.Function,但我已经编辑了我的答案以包含 on 的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多