0

重複の可能性:
Haskell-リストを選択的に追加する

私はデータ型を持っています:

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) 
4

1 に答える 1

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)

[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
于 2012-05-01T14:02:32.370 に答える