1

我有以下类型:

type Rating = (String, Int)
type Film = (String, String, Int, [Rating])

testDatabase :: [Film]
testDatabase = [("Director 1","Film 1",2012,[("TestRat",8)]),("Director 2","Film 2",2,[])]

我需要找出导演的平均评分是基于他们所有电影的总和,然后是他们所有评分的总和。我真的不知道如何处理这个问题,我发现仅仅获得电影中元组的平均值就已经够难了,更不用说通过所有这些元组来做到这一点了。

我计算平均值的代码:

filmRating :: [(String,Int)] -> Float
filmRating ratings = average (map snd ratings)

average ratings = realToFrac (sum ratings) / genericLength ratings  
4

1 回答 1

3

Data.List中有许多有用的函数用于数据分析。

特别groupBy是超级有用:

> :t groupBy
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]

给定一个相等函数,将列表分组到桶中。

访问目录的函数:

 > let fst4 (x,_,_,_) = x

然后,对主管名称和按该主管的存储桶(组)进行排序。

 > let db0 = sortBy (comparing fst4) testDatabase
 > let db1 = groupBy ((==) `on` fst4) db0
 [ [("Director 1","Film 1",2012, [("TestRat",8)])]
 , [("Director 2","Film 2",2    ,[])]
 ]

groupBy非常有用……

于 2012-04-18T13:37:33.840 回答