本当の答えではなく、ほんの一部の初心者メモです。
Director
,Title
などのタイプエイリアスを使用できます。
だあなた
film
例がどのように見えるべき理由
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)
:あなたはfilmRating
という名前の関数を持っている場合
film = Film "Ridley Scott" "Alien" 1979 [("Mark",5),("Zoe",3)]
それは:: Film -> Rate
のようなものでなければなりません:
filmRating :: Film -> Rate
filmRating (Film _ _ _ ratings) = average (map snd ratings)
どうでしょう平均的なダイレクトを手に入れよう[映画]リストのすべての映画の評価?
あなたはdirectorsAverageRate :: Director -> [Film] -> Rate
のようになります。
まず、フィルムをDirector
値でフィルタリングする必要があります。値は:: Film -> Director
です。このフィルタリングされたリストの場合、平均レートはaverage . (map filmRating)
となります。
UPD:
私は関与して映画を持っていた後、私は、全体の平均値を取得する方法を理解していません。
のはsimilar questionから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
あなたは、私たちにあなたが書いしようとしたコードをしてください示してもらえますか? –
私は、単一のFilm filmRating :: [(String、Int)] - > Floatを計算するコードを持っています filmRating ratings = average(map snd ratings) – JamieB
平均スコアを返す関数 'Film - > Float'を書く(パターンマッチングを使う)。次に、映画のリストの平均スコアを返す '' Film - > Float'関数を書く( 'average'とそれ以前の関数を使う)。 – sdcvvc