2012-04-18 10 views
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 
+1

...非常に便利ですか!統計を計算する関数、またはデータをどのように分割するのか? –

+0

すべてのディレクターの評価を1つのリストにまとめることができれば、残りの作業はできますが、1つのリストに分割する方法はわかりません。 – JamieB

+0

ここで便利な機能は、 'filter'(特定のディレクターによる映画のみを選択する)と' concat'(格付けのリストを格付けのリストにする)です。 – dave4420

答えて

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あなたが立ち往生している何

+3

注意 'on'は' Data.Function'からのものであり、 'comparison'は' Data.Ord'からのものです。 –

+0

私はこれに戻って指摘してくれてありがとう、私は平均を見つけることができます私はすでに監督が関与している映画を得ることができますが、私はすべての映画から平均を得ることはできません。 – JamieB