本当の答えではなく、初心者向けのメモです。
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)
[Film] のリストに含まれるすべての映画の平均監督評価を取得するにはどうすればよいですか?
のようなものが必要ですdirectorsAverageRate :: Director -> [Film] -> Rate
。
まず、関数を使用してフィルムをDirector
値でフィルタリングする必要があり:: Film -> Director
ます。このフィルタリングされたリストでは、 で平均レートを取得するだけですaverage . (map filmRating)
。
更新日:
映画を含めた後、全体の平均を取得する方法がわかりません。
同様の質問average
から関数の定義を見てみましょう:
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