我想添加另一个条件,删除已经喜欢电影的用户

时间:2018-03-17 12:40:06

标签: haskell

我正在尝试创建一个允许用户不喜欢电影的功能。但是,用户只能存在于喜欢/不喜欢的列表中,而不能同时存在于

 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; UserStringsLikeDislikes是元组Film中的列表。

1 个答案:

答案 0 :(得分:0)

尝试在列表理解中实现这一点并不是最简单或更易读的方法。相反,请考虑定义处理单个Film的函数。如果你有这样的功能,整体功能就变成了一个简单的地图:

addUserDislikes :: Title -> User -> [Film] -> [Film]
addUserDislikes title user = fmap $ dislikeFilm title user

如果您愿意,可以将dislikeFilm定义为独立函数,或者使用let中的whereaddUserDislikes来定义它。如果您将该函数编写为独立函数,则可以这样写:

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未修改。另一方面,如果标题匹配,则缺席 userdislikes,同时从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 ,但我想使用一些短片电影。)