2012-05-01 114 views
0

可能重复:
Haskell - Selectively Adding ListsHaskell的 - 元组的列表的平均

我有一个数据类型:

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) 
+0

你能告诉我们你试着写代码,好吗? –

+0

我只有代码来制定一个单一的Film FilmRating :: [(String,Int)] - > Float filmRating ratings = average(map snd ratings) – JamieB

+0

写一个函数'Film - > Float'将返回平均分数的电影(使用模式匹配)。然后,写一个函数'[Film] - > Float',它将返回电影列表的平均分数(使用'平均值'和前一个函数)。 – sdcvvc

回答

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)即可获得平均费率。


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 
+0

是的,我明白过滤,但我不明白如何获得整体平均后,我有电影介入。 – JamieB