我正在尝试创建一个允许用户不喜欢电影的功能。但是,用户只能存在于喜欢/不喜欢的列表中,而不能同时存在于
中 addUserDislikes :: Title -> User -> [Film] -> [Film]
addUserDislikes title user db = [ if ti == title && elem user dislike == False then (ti, di, yr,like,dislike++ [user])else (ti, di, yr, like, dislike) | (ti, di, yr, like, dislike) <- db]
此功能仅将用户添加到“不喜欢”列表中,但不会将其从“喜欢”列表中删除,我该怎么做?
其他信息 - Title
&amp; User
是Strings
。 Like
和Dislikes
是元组Film
中的列表。
答案 0 :(得分:0)
尝试在列表理解中实现这一点并不是最简单或更易读的方法。相反,请考虑定义处理单个Film
的函数。如果你有这样的功能,整体功能就变成了一个简单的地图:
addUserDislikes :: Title -> User -> [Film] -> [Film]
addUserDislikes title user = fmap $ dislikeFilm title user
如果您愿意,可以将dislikeFilm
定义为独立函数,或者使用let
中的where
或addUserDislikes
来定义它。如果您将该函数编写为独立函数,则可以这样写:
dislikeFilm title user film@(ti, di, yr, likes, dislikes) =
if ti == title
then (ti, di, yr, delete user likes, user : dislikes)
else film
请注意,如果film
不匹配,此函数将返回title
未修改。另一方面,如果标题匹配,则缺席 user
到dislikes
,同时从likes
删除。为此,它使用delete
中的Data.List
。
以下是一些例子:
*Q49336125> addUserDislikes "2010" "foo" []
[]
*Q49336125> addUserDislikes "2010" "foo" [("2010", "Peter Hyams", 1984, [], [])]
[("2010","Peter Hyams",1984,[],["foo"])]
*Q49336125> addUserDislikes "2010" "foo" [("2010", "Peter Hyams", 1984, ["foo"], [])]
[("2010","Peter Hyams",1984,[],["foo"])]
*Q49336125> addUserDislikes "2010" "foo" [
("2010", "Peter Hyams", 1984, ["foo"], ["bar"]),
("2001", "Stanley Kubrick", 1968, ["baz", "qux"], [])]
[("2010","Peter Hyams",1984,[],["foo","bar"]),
("2001","Stanley Kubrick",1968,["baz","qux"],[])]
(由我编辑的最后评估,使其更具可读性。)
(P.S。我喜欢 2001 和 2010 ,但我想使用一些短片电影。)