不是一个真正的答案,只是一些新手笔记。
您可以使用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