不是一個真正的答案,只是一些新手筆記。
您可以使用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
你能告訴我們你試着寫代碼,好嗎? –
我只有代碼來制定一個單一的Film FilmRating :: [(String,Int)] - > Float filmRating ratings = average(map snd ratings) – JamieB
寫一個函數'Film - > Float'將返回平均分數的電影(使用模式匹配)。然後,寫一個函數'[Film] - > Float',它將返回電影列表的平均分數(使用'平均值'和前一個函數)。 – sdcvvc