我有一个数据库中的电影列表。
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)
我想要做的是找出我的列表中的电影。
功能一
功能二
降序
我目前有两段代码,我正在尝试一起工作。或者找到更好的溶剂:
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
答案 0 :(得分:3)
我认为你肯定是在正确的轨道上。虽然最后一个函数filmsWithFan
在这种情况下对你没有帮助。我会给你一些提示:
功能1:
首先考虑您希望为您的函数设置的类型签名:
topByFanAndActor :: Actor -> Database -> Film
topByFanAndActor actor films = undefined
考虑如何组合您提供的两个功能,主要是inCast
和bestFilm
来实现该类型签名。您肯定需要使用处理列表的更高阶函数。如果您需要另一个提示,我可以告诉它将是什么函数。
编辑:
因此,您需要将给定列表films
转换为给定actor
星的电影列表。为此,您需要filter
使用您的函数列出inCast
}}。之后,您需要从该列表中提取具有最大粉丝数量的电影,为此您将使用bestFilm
。
功能2:
在这种情况下,类型签名将非常简单:
topFiveDesc :: Database -> Database
但如果你让电影的数量变回变量,你可以做得更好一点:
topDesc :: Database -> Int -> Database
topDesc films num = undefined
想想你现在与电影有什么关系。您需要按特定标准(风扇数量)对其进行排序。标准定义与bestFilm
中的标准类似。然后你需要从该列表中拍摄第一部num
部电影。