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)

我想要做的是找出我列表中的电影。

功能一

  • 拥有最多粉丝
  • 按特定演员名称过滤。

功能二

  • 总体排名前 5 的电影(按粉丝数量)
  • 降序排列

                                                                                                                                                                                    

我目前有两个代码片段,我要么试图让它们一起工作。或者找到更好的解决方案:

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在这种情况下,最后一个函数 , 对您没有帮助。我会给你一些提示:

功能一:

首先考虑您希望为您的函数使用的类型签名:

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

想一想如何结合你提供的两个函数,主要是inCast为了bestFilm实现那个类型签名。您肯定需要使用处理列表的高阶函数。如果您需要另一个提示,我可以告诉您那将是什么功能。

编辑:

因此,您需要将给定列表films转换为给定actor明星所在的电影列表。为此,您需要filter使用您的函数将该列表inCast。之后,您需要从该列表中提取具有最大粉丝数的电影,为此您将使用bestFilm.

功能二:

在这种情况下,类型签名将非常简单:

topFiveDesc :: Database -> Database

但是如果你让电影的数量返回变量,你可以让它更好一点:

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

想一想你现在与这些电影有什么关系。您需要按特定标准(粉丝数量)对其进行排序。与 中的标准类似定义的标准bestFilm。之后,您需要num从该列表中取出第一部电影。

于 2013-04-22T23:04:45.730 回答