如何筛选结果以正确显示

时间:2013-04-22 22:46:25

标签: haskell functional-programming

我有一个数据库中的电影列表。

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

1 个答案:

答案 0 :(得分:3)

我认为你肯定是在正确的轨道上。虽然最后一个函数filmsWithFan在这种情况下对你没有帮助。我会给你一些提示:

功能1:

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

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

考虑如何组合您提供的两个功能,主要是inCastbestFilm来实现该类型签名。您肯定需要使用处理列表的更高阶函数。如果您需要另一个提示,我可以告诉它将是什么函数。

编辑:

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

功能2:

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

topFiveDesc :: Database -> Database

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

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

想想你现在与电影有什么关系。您需要按特定标准(风扇数量)对其进行排序。标准定义与bestFilm中的标准类似。然后你需要从该列表中拍摄第一部num部电影。