0

可能重复:
Haskell - 有选择地添加列表

我有一个数据类型:

data Film = Film String String Int [Rating]
     deriving (Show,Ord,Eq, Read)

样片:

("Ridley Scott","Alien",1979,[("Mark",5),("Zoe",3)])

我将如何获得 [电影] 列表中所有电影的平均导演评分?

因此,如果雷德利·斯科特有两部电影的平均得分均为 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)

我将如何获得 [电影] 列表中所有电影的平均导演评分?

你想要类似的东西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 回答