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 に答える