我有以下类型:
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
答案 0 :(得分: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
非常有用......