如何基于已实现的Haskell评分函数将网站评分纳入影片列表?
把网站评分加入影片列表的实现方案
看起来你已经搞定了核心的评分计算逻辑,现在要把网站评分和影片信息绑定到列表里对吧?我来给你两种实用的实现思路:
1. 生成「影片+评分」的元组列表
这种方式不需要修改现有Film类型,直接用元组把影片和对应的评分打包在一起,简单直接:
-- 给所有影片添加对应的网站评分 filmsWithRating :: [Film] -> [(Film, Int)] filmsWithRating films = [(film, websiteRating film) | film <- films] -- 只给评分≥75的高评分影片添加评分(结合你已有的rating函数) highRatedFilmsWithRating :: [Film] -> [(Film, Int)] highRatedFilmsWithRating films = [(film, websiteRating film) | film <- rating films]
示例用法
假设你的Film类型是类似这样的定义(如果和你的实际定义不同,调整即可):
type Film = (String, String, Int, [String], [String]) -- 标题、导演、年份、点赞用户、踩用户 -- 测试影片数据 testFilms :: [Film] testFilms = [ ("Inception", "Christopher Nolan", 2010, ["Alice", "Bob", "Cindy"], []), -- 3赞0踩,评分100 ("Midnight in Paris", "Woody Allen", 2011, ["Dave", "Eve"], ["Frank"]), -- 2赞1踩,评分67 ("Bad Film", "Unknown Director", 2023, ["Gary"], ["Helen", "Ivy", "Jack"]) -- 1赞3踩,评分25 ]
调用filmsWithRating testFilms会得到:
[(("Inception","Christopher Nolan",2010,["Alice","Bob","Cindy"],[]),100), (("Midnight in Paris","Woody Allen",2011,["Dave","Eve"],["Frank"]),67), (("Bad Film","Unknown Director",2023,["Gary"],["Helen","Ivy","Jack"]),25)]
调用highRatedFilmsWithRating testFilms则只会返回评分≥75的条目:
[(("Inception","Christopher Nolan",2010,["Alice","Bob","Cindy"],[]),100)]
2. 定义新类型包含评分(更结构化的方式)
如果希望影片信息和评分的绑定更清晰,可以定义一个新的FilmWithRating类型,把评分作为影片数据的一部分:
data FilmWithRating = FilmWithRating { film :: Film , siteRating :: Int } deriving (Show) -- 派生Show方便打印输出 -- 生成带评分的影片列表 filmsWithRating' :: [Film] -> [FilmWithRating] filmsWithRating' films = [FilmWithRating film (websiteRating film) | film <- films] -- 筛选高评分的带评分影片列表 highRatedFilmsWithRating' :: [Film] -> [FilmWithRating] highRatedFilmsWithRating' films = [FilmWithRating film (websiteRating film) | film <- rating films]
示例用法
调用highRatedFilmsWithRating' testFilms会得到:
[FilmWithRating {film = ("Inception","Christopher Nolan",2010,["Alice","Bob","Cindy"],[]), siteRating = 100}]
这种方式的好处是,后续访问评分时可以用siteRating字段名,代码可读性更高。
另外,你的现有函数逻辑没问题,userRate里处理点赞+踩数量为0的情况很合理,避免了除以0的错误~
内容的提问来源于stack exchange,提问作者sam786
相关产品推荐
相关产品推荐

