0

データベースに映画のリストがあります。

type Database = [Film]
type Title = String
type Actor = String
type Cast = [Actor]
type Fan = String
type Fans = [Fan]
type Year = Int
type Period = (Year, Year)
type Film = (Title, Cast, Year, Fans)

私ができるようになりたいのは、私のリストからどの映画を見つけるかです。

機能 1

  • 最もファンが多い
  • 特定のアクター名でフィルタリングされます。

機能 2

  • 総合上位5作品(ファン数別)
  • 降順

                                                                                                                                                                                    

私は現在、連携させようとしているコードのスニペットを 2 つ持っています。または、より良い解決策を見つけてください。

inCast :: Actor -> Film -> Bool
inCast givenActor (_, cast, _, _) = any (\actor -> actor == givenActor) cast

import Data.List
import Data.Ord

bestFilm :: Database -> Film
bestFilm = maximumBy $ comparing (length . fans)

私はこれについて完全に間違った方向に進んでいますか?

事前に助けてくれてありがとう。

編集:私が持っている追加のコード。この部分を解決するのを助けるために、私はそれを使用できないようです。何か案は?

filmsWithFan :: Fan -> [Film]
filmsWithFan givenFan = filter (isFan givenFan) testDatabase
4

1 に答える 1

3

あなたは間違いなく正しい軌道に乗っていると思います。filmsWithFanこの場合、最後の関数は役に立ちません。私はあなたにいくつかのヒントを与えます:

機能 1:

最初に、関数に必要な型シグネチャについて考えてください。

topByFanAndActor :: Actor ->  Database -> Film
topByFanAndActor actor films = undefined

inCast提供した 2 つの関数をどのように組み合わせて、主にbestFilmその型シグネチャを実現できるかを考えてください。リストを処理する高次関数を必ず使用する必要があります。別のヒントが必要な場合は、それがどのような機能になるかを教えてください。

編集:

したがって、与えられたリストを、与えられた星filmsが出演する映画のリストに変換する必要があります。そのためには、関数を使用してそのリストに変換する必要があります。その後、そのリストからファンの数が最大の映画を抽出する必要があります。そのためには、 を使用します。actorfilterinCastbestFilm

機能 2:

この場合、型シグネチャは非常に単純になります。

topFiveDesc :: Database -> Database

ただし、映画の数を変数にすると、少し良くなります。

topDesc :: Database -> Int -> Database
topDesc films num = undefined

今、映画と何をしなければならないかを正確に考えてください。特定の基準 (ファンの数) で並べ替える必要があります。の基準と同様に定義された基準bestFilmnumその後、そのリストから最初の映画を取得する必要があります。

于 2013-04-22T23:04:45.730 に答える