2014-03-12 86 views
0

我試圖給出在給定年份或之後發佈的所有電影,按照網站評級的降序排列。haskell中的列表降序​​排序

我設法做出一個函數來返回平均評分和函數來過濾數據庫並返回給定年份的電影。

這裏的問題是如何將這兩個放在一起,並按降序排序。我不太確定或熱衷於此,需要一些幫助。

import Data.List 
import Text.Printf 
import Data.Ord 

type Rating = (String, Int) 
type Title = String 
type Director = String 
type Year = Int 
type Film = (Title, Director, Year,[Rating]) 

testDatabase :: [Film] 
testDatabase = [("Blade Runner","Ridley Scott",1982,[("Amy",6), ("Bill",9), ("Ian",7), ("Kevin",9), ("Emma",4), ("Sam",5), ("Megan",4)]), 
       ("The Fly","David Cronenberg",1986,[("Megan",4), ("Fred",7), ("Chris",5), ("Ian",0), ("Amy",5)]), 
       ("Psycho","Alfred Hitchcock",1960,[("Bill",4), ("Jo",4), ("Garry",8), ("Kevin",7), ("Olga",8), ("Liz",10), ("Ian",9)]), 
       ("Body Of Lies","Ridley Scott",2008,[("Sam",3), ("Neal",7), ("Kevin",2), ("Chris",5), ("Olga",6)]), 
       ("Avatar","James Cameron",2009,[("Olga",2), ("Wally",8), ("Megan",9), ("Tim",5), ("Zoe",8), ("Emma",3)]), 
       ("Titanic","James Cameron",1997,[("Zoe",7), ("Amy",2), ("Emma",5), ("Heidi",3), ("Jo",8), ("Megan",5), ("Olga",7), ("Tim",10)]), 
       ("The Departed","Martin Scorsese",2006,[("Heidi",2), ("Jo",8), ("Megan",5), ("Tim",2), ("Fred",5)]), 
       ("Aliens","Ridley Scott",1986,[("Fred",8), ("Dave",6), ("Amy",10), ("Bill",7), ("Wally",2), ("Zoe",5)]), 
       ("Prometheus","Ridley Scott",2012,[("Garry",3), ("Chris",4), ("Emma",5), ("Bill",1), ("Dave",3)]), 
       ("E.T. The Extra-Terrestrial","Steven Spielberg",1982,[("Ian",7), ("Amy",2), ("Emma",7), ("Sam",8), ("Wally",5), ("Zoe",6)]), 
       ("The Birds","Alfred Hitchcock",1963,[("Garry",7), ("Kevin",9), ("Olga",4), ("Tim",7), ("Wally",3)]), 
       ("Goodfellas","Martin Scorsese",1990,[("Emma",7), ("Sam",9), ("Wally",5), ("Dave",3)]), 
       ("The Shawshank Redemption","Frank Darabont",1994,[("Jo",8), ("Sam",10), ("Zoe",3), ("Dave",7), ("Emma",3), ("Garry",10), ("Kevin",7)]), 
       ("Gladiator","Ridley Scott",2000,[("Garry",7), ("Ian",4), ("Neal",6), ("Wally",3), ("Emma",4)]), 
       ("The Green Mile","Frank Darabont",1999,[("Sam",3), ("Zoe",4), ("Dave",8), ("Wally",5), ("Jo",5)]), 
       ("True Lies","James Cameron",1994,[("Dave",3), ("Kevin",4), ("Jo",0)]), 
       ("Minority Report","Steven Spielberg",2002,[("Dave",5), ("Garry",6), ("Megan",2), ("Sam",7), ("Wally",8)]), 
       ("The Wolf of Wall Street","Martin Scorsese",2013,[("Dave",6), ("Garry",6), ("Megan",0), ("Sam",4)]), 
       ("War Horse","Steven Spielberg",2011,[("Dave",6), ("Garry",6), ("Megan",3), ("Sam",7), ("Wally",8), ("Zoe",8)]), 
       ("Lincoln","Steven Spielberg",2012,[("Ian",3), ("Sam",7), ("Wally",3), ("Zoe",4), ("Liz",7), ("Megan",4)]), 
       ("Vertigo","Alfred Hitchcock",1958,[("Bill",7), ("Emma",5), ("Zoe",9), ("Olga",6), ("Tim",10)]), 
       ("The Terminal","Steven Spielberg",2004,[("Olga",3), ("Heidi",8), ("Bill",2), ("Sam",6), ("Garry",8)]), 
       ("Jaws","Steven Spielberg",1975,[("Fred",3), ("Garry",0), ("Jo",3), ("Neal",9), ("Emma",7)]), 
       ("Hugo","Martin Scorsese",2011,[("Sam",4), ("Wally",3), ("Zoe",4), ("Liz",7)])]  

averageFilmRating :: [(String,Int)] -> Float 
averageFilmRating ratings 
    = (fromIntegral(sum $ map snd ratings))/(fromIntegral(length ratings)) 

--Displays films by year 
filmsByYear :: Int -> [Film] 
filmsByYear year 
    = filter(\(_,_,yr,_) -> yr >= year) testDatabase  
+1

當與哈斯克爾工作清單幾乎總是有一個函數來完成由序曲提供的任務。養成自己能夠瀏覽Hoogle的習慣是很好的。例如,你想要的功能稱爲''sortBy'':http://www.haskell.org/hoogle/?hoogle=sort –

回答

2
import Data.List 
import Data.Ord 

sortFilms :: [Film] -> [Film] 
sortFilms = sortBy $ flip $ comparing averageFilmRating' 
    where 
    averageFilmRating' (_,_,_,rs) = averageFilmRating rs 
+0

似乎得到這個錯誤:不在範圍內:'開' 也許你的意思'或'(從Data.List導入) 請你也可以解釋它是如何工作的 – user3411002

+0

它在Data.Function中。 – Benesh

+0

謝謝,我如何運行這個來顯示輸入年份後的排序? – user3411002