2012-05-01 107 views
0

可能重複:
Haskell - Selectively Adding ListsHaskell的 - 元組的列表的平均

我有一個數據類型:

data Film = Film String String Int [Rating] 
    deriving (Show,Ord,Eq, Read) 

試樣膜:

("Ridley Scott","Alien",1979,[("Mark",5),("Zoe",3)]) 

我會如何獲得所有電影中[電影]列表的平均導演評級?

所以,如果雷德利·斯科特有2片這兩種分別具有5的平均分,然後他會進球的5

的整體平均我只有代碼,制定出一個電影

filmRating :: [(String,Int)] -> Float 
filmRating ratings = average (map snd ratings) 
+0

你能告訴我們你試着寫代碼,好嗎? –

+0

我只有代碼來制定一個單一的Film FilmRating :: [(String,Int)] - > Float filmRating ratings = average(map snd ratings) – JamieB

+0

寫一個函數'Film - > Float'將返回平均分數的電影(使用模式匹配)。然後,寫一個函數'[Film] - > Float',它將返回電影列表的平均分數(使用'平均值'和前一個函數)。 – sdcvvc

回答

1

不是一個真正的答案,只是一些新手筆記。

您可以使用Director,Title和所有其他類型的類型別名。

type Director = String 
type Rate = Double 
type Rater = String 
type Ratings = [(Rater, Rate)] 
type Title = String 
type Year = Int 

data Film = Film Director Director Year Ratings 
    deriving (Show,Ord,Eq, Read) 

這就是爲什麼你film的例子應該是這樣的:

film = Film "Ridley Scott" "Alien" 1979 [("Mark",5),("Zoe",3)]

如果你有一個函數命名filmRating它應該是這樣的:: Film -> Rate

filmRating :: Film -> Rate 
filmRating (Film _ _ _ ratings) = average (map snd ratings) 

會如何我開始討論平均直播在[電影]列表中所有影片的評級?

你想要類似directorsAverageRate :: Director -> [Film] -> Rate

首先,你需要通過Director值來過濾一些:: Film -> Director函數的值。對於此過濾列表,您只需使用average . (map filmRating)即可獲得平均費率。


UPD

我不明白如何讓整體平均後,我有參與的電影。

讓我們average函數的定義從similar question

average :: (Real a, Fractional b) => [a] -> b 
average xs = realToFrac (sum xs)/genericLength xs 

然後

> let one_film = Film "Ridley Scott" "Alien" 1979 [("Mark",5),("Zoe",3)] 
one_film :: Film 

> let another_film = Film "Ridley Scott" "Alien2" 2979 [("Mark",4),("Zoe",2)] 
another_film :: Film 

> let films = [one_film, another_film] 
films :: [Film] 

> average . (map filmRating) $ films 
3.5 
it :: Double 
+0

是的,我明白過濾,但我不明白如何獲得整體平均後,我有電影介入。 – JamieB