Sorting 列表的降序排序

Sorting 列表的降序排序,sorting,haskell,Sorting,Haskell,我试图根据平均评分对列表进行排序。我设法制作了一个函数来返回平均评级,一个函数来过滤数据库并返回给定年份的电影。 但是我怎样才能把所有的东西放在一起,得到排序后的输出呢?你能给我一些提示吗 我的代码是: -- Define Film type here type Film = (Title, Director, Year, [Rating]) -- Define database type here type Database = [Film] testDatabase :: [Film]

我试图根据平均评分对列表进行排序。我设法制作了一个函数来返回平均评级,一个函数来过滤数据库并返回给定年份的电影。 但是我怎样才能把所有的东西放在一起,得到排序后的输出呢?你能给我一些提示吗

我的代码是:

-- Define Film type here
type Film = (Title, Director, Year, [Rating])

-- Define database type here
type Database = [Film]

testDatabase :: [Film]
testDatabase =
  [("Casino Royale", "Martin Campbell",  2006, [("Garry",8),("Dave", 0)])
  ,("Blade Runner",  "Ridley Scott",     1982, [("Amy",  5),("Dave", 9)])
  ,("The Fly",       "David Cronenberg", 1986, [("Fred", 7),("Dave", 4)])
  ]

-- These 2 functions are for the average rating

averageFilm :: Film -> Float
averageFilm (t, d, y, r) = averageFilmRating r

averageFilmRating :: [Rating] -> Float
averageFilmRating rating = fromIntegral ((sum [r | (_,r) <- rating])) / fromIntegral ((length rating))

---- These 2 functions are for the year filtering

displayFilmsYear :: Year -> Database -> String
displayFilmsYear year database = displayFilms (filter (filmYear year) database)

filmYear :: Year -> Film -> Bool
filmYear year (t, c, y, f)
         | year <= y = True
     | otherwise = False 
sortBy允许您使用给定的比较函数对列表进行排序。此函数具有类型

a->a->订购

其中,排序指示第一个参数是否小于、大于或等于第一个参数

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
因此,对于您的电影列表,您的比较功能具有类型Film->Film->Ordering。您可以创建这样一个函数 与之相比:

在您的情况下,您需要返回序号值来比较胶片。你已经有了这样一部功能平均的电影。因此,比较averageFilm将返回一个函数Film->Film->Ordering,该函数根据两部影片的评级对其进行比较

sortBy comparing averageFilm将按评级按升序对列表进行排序,因此要按降序排序,只需将参数的顺序翻转到比较函数,即翻转comparing averageFilm

sortBy允许您使用给定的比较函数对列表进行排序。此函数具有类型

a->a->订购

其中,排序指示第一个参数是否小于、大于或等于第一个参数

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
因此,对于您的电影列表,您的比较功能具有类型Film->Film->Ordering。您可以创建这样一个函数 与之相比:

在您的情况下,您需要返回序号值来比较胶片。你已经有了这样一部功能平均的电影。因此,比较averageFilm将返回一个函数Film->Film->Ordering,该函数根据两部影片的评级对其进行比较


sortBy comparing averageFilm将按评级按升序对列表进行排序,因此要按降序排序,只需将参数的顺序翻转到比较函数,即翻转comparing averageFilm。

非常感谢。它工作得很好。如果你有时间,能给我描述一下我们刚才做了什么吗?再次非常感谢!比较是一个带有签名比较的函数::Ord a=>b->a->b->b->排序b->a函数是平均胶片,其他两个b是胶片。翻转的目的是颠倒胶片应用于比较的顺序。这就是电影按相反顺序排序的原因。@user3207652-我已经添加了一个解释。Data.Ord模块还提供Down,它接受现有的排序并将其反转。所以,你也可以通过比较美元下跌来做一些糟糕的事情。很好的解释!谢谢大家!你回答了我心中所有的问题!你太棒了!非常感谢李。它工作得很好。如果你有时间,能给我描述一下我们刚才做了什么吗?再次非常感谢!比较是一个带有签名比较的函数::Ord a=>b->a->b->b->排序b->a函数是平均胶片,其他两个b是胶片。翻转的目的是颠倒胶片应用于比较的顺序。这就是电影按相反顺序排序的原因。@user3207652-我已经添加了一个解释。Data.Ord模块还提供Down,它接受现有的排序并将其反转。所以,你也可以通过比较美元下跌来做一些糟糕的事情。很好的解释!谢谢大家!你回答了我心中所有的问题!你太棒了!
comparing :: Ord a => (b -> a) -> (b -> b -> Ordering)