Haskell(标题和用户评级)
这是一个电影数据库的项目。我必须显示电影的标题和用户的评级 有了这段代码,我可以显示用户已经评级的所有电影(以及其他用户的评级) 如何才能分别获得每部电影的用户评级 当前不想要的结果:Haskell(标题和用户评级),haskell,Haskell,这是一个电影数据库的项目。我必须显示电影的标题和用户的评级 有了这段代码,我可以显示用户已经评级的所有电影(以及其他用户的评级) 如何才能分别获得每部电影的用户评级 当前不想要的结果: ghci> displayFilmsRating "Zoe" testDatabase Title: Hugo Rating: [("Sam",4),("Wally",3),("Zoe",4),("Liz",7)] Title: Vertigo Rating: [("Bill",7),("Emma",5
ghci> displayFilmsRating "Zoe" testDatabase
Title: Hugo
Rating: [("Sam",4),("Wally",3),("Zoe",4),("Liz",7)]
Title: Vertigo
Rating: [("Bill",7),("Emma",5),("Zoe",9),("Olga",6),("Tim",10)]
Title: Lincoln
Rating: [("Ian",3),("Sam",7),("Wally",3),("Zoe",4),("Liz",7),("Megan",4)]
通缉令
标题:泰坦尼克号评级:7 标题:阿凡达
评级:7 所有其他用户的评级都应该消失 更新: 我又做了一次尝试,但没有成功。如果您愿意,您可以看一看并给出一些想法:
listRatedFilms :: String -> Film -> Bool
listRatedFilms givenUsername (t, d, y, r) = hasRated r givenUsername
hasRated :: [Rating] -> String -> Bool
hasRated [] givenUsername = False
hasRated ((name, rate):xs) givenUsername
| name == givenUsername && rate > 0 = True
| otherwise = hasRated xs givenUsername
-- This new function returns a database, whith all the films that the user has rated
findLikedFilms :: String -> Database -> Database
findLikedFilms username database = filter (listRatedFilms username) database
-- these functions returns the rating of the user's
takeMark :: [Rating] -> String -> Int
takeMark [] givenUsername = 0
takeMark ((name, rate):xs) givenUsername
| name == givenUsername && rate > 0 = rate
| otherwise = takeMark xs givenUsername
takeMarks :: String -> Film -> Int
takeMarks givenUsername (t, d, y, r) = takeMark r givenUsername
--
displayFilmsRating :: String -> Database -> String
displayFilmsRating username database = map (findLikedFilms (username database)) (takeMarks (username database))
displayRatedFilms :: Database -> Int -> String
displayRatedFilms database mark = concat(map (displayRatedFilmtest database) mark)
displayRatedFilmtest :: Film -> Int -> String
displayRatedFilmtest (title, director, year, rating) mark = "\nTitle: " ++ title ++ "\nRating: " ++ (show mark) ++ "\n"
我必须以某种方式编写函数displayFilmRating和displayRatedFilms,将所有内容放在一起,然后返回到displayRatedFilmtest函数film和mark
有了这些函数,我可以分别得到我需要的结果,但我没有运气把它们放在一个函数中
上次编辑:
我试图通过displayRatedFilm函数显示DisplayRateDfilmsfourser的结果,但当我将DisplayRateDfilmsfourser的输出从IO()更改为字符串时,获取错误并请求IO()。当它的IO()工作正常。
我的修改出了什么问题
displayRatedFilmsForUser :: String -> Database -> IO()
displayRatedFilmsForUser username database = mapM_ (showResult) $ findLikedFilms username database
where
showResult film@(t, _, _, rs) = displayRatedFilm t (takeMarks username film)
displayRatedFilm :: Title -> Mark -> String
displayRatedFilm title mark = "\nTitle: " ++ (show title) ++ "\nRating: " ++ (show mark) ++ "\n"
下面的代码将查找数据的代码与显示数据的代码分开。通过这种方式,您可以将其发送到其他地方,使用GUI等
showFilmUserInfo :: String -> Film -> (String, String)
showFilmUserInfo username (t, _, _, rs) =
(("Title: " ++ t), ("Rating: " ++ (getUserRating username rs)))
where
getUserRating username rs =
case lookup username rs of
-- your ratings are an "association list" see, Data.List
Just rating -> show rating
Nothing -> "unrated"
-- or whatever you want to return here
lookupUsersFilmRatings :: String -> Database -> [(String, String)]
lookupUsersFilmRatings username database =
map (showFilmUserInfo username) database
displayUsersFilmRatings :: String -> Database -> IO [()]
displayUsersFilmRatings username database =
mapM_ (putStrLn . (\(t,r) -> t ++ "\n" ++ r ++ "\n"))
(lookupUsersFilmRatings username database)
例如:
ghci> displayUsersFilmRatings "Dave" testDatabase
Title: Casino Royale
Rating: 0
Title: Blade Runner
Rating: 9
Title: Ghost Busters
Rating: unrated
Title: The Fly
Rating: 4
下面的代码将查找数据的代码与显示数据的代码分开。通过这种方式,您可以将其发送到其他地方,使用GUI等
showFilmUserInfo :: String -> Film -> (String, String)
showFilmUserInfo username (t, _, _, rs) =
(("Title: " ++ t), ("Rating: " ++ (getUserRating username rs)))
where
getUserRating username rs =
case lookup username rs of
-- your ratings are an "association list" see, Data.List
Just rating -> show rating
Nothing -> "unrated"
-- or whatever you want to return here
lookupUsersFilmRatings :: String -> Database -> [(String, String)]
lookupUsersFilmRatings username database =
map (showFilmUserInfo username) database
displayUsersFilmRatings :: String -> Database -> IO [()]
displayUsersFilmRatings username database =
mapM_ (putStrLn . (\(t,r) -> t ++ "\n" ++ r ++ "\n"))
(lookupUsersFilmRatings username database)
例如:
ghci> displayUsersFilmRatings "Dave" testDatabase
Title: Casino Royale
Rating: 0
Title: Blade Runner
Rating: 9
Title: Ghost Busters
Rating: unrated
Title: The Fly
Rating: 4
下面的代码将查找数据的代码与显示数据的代码分开。通过这种方式,您可以将其发送到其他地方,使用GUI等
showFilmUserInfo :: String -> Film -> (String, String)
showFilmUserInfo username (t, _, _, rs) =
(("Title: " ++ t), ("Rating: " ++ (getUserRating username rs)))
where
getUserRating username rs =
case lookup username rs of
-- your ratings are an "association list" see, Data.List
Just rating -> show rating
Nothing -> "unrated"
-- or whatever you want to return here
lookupUsersFilmRatings :: String -> Database -> [(String, String)]
lookupUsersFilmRatings username database =
map (showFilmUserInfo username) database
displayUsersFilmRatings :: String -> Database -> IO [()]
displayUsersFilmRatings username database =
mapM_ (putStrLn . (\(t,r) -> t ++ "\n" ++ r ++ "\n"))
(lookupUsersFilmRatings username database)
例如:
ghci> displayUsersFilmRatings "Dave" testDatabase
Title: Casino Royale
Rating: 0
Title: Blade Runner
Rating: 9
Title: Ghost Busters
Rating: unrated
Title: The Fly
Rating: 4
下面的代码将查找数据的代码与显示数据的代码分开。通过这种方式,您可以将其发送到其他地方,使用GUI等
showFilmUserInfo :: String -> Film -> (String, String)
showFilmUserInfo username (t, _, _, rs) =
(("Title: " ++ t), ("Rating: " ++ (getUserRating username rs)))
where
getUserRating username rs =
case lookup username rs of
-- your ratings are an "association list" see, Data.List
Just rating -> show rating
Nothing -> "unrated"
-- or whatever you want to return here
lookupUsersFilmRatings :: String -> Database -> [(String, String)]
lookupUsersFilmRatings username database =
map (showFilmUserInfo username) database
displayUsersFilmRatings :: String -> Database -> IO [()]
displayUsersFilmRatings username database =
mapM_ (putStrLn . (\(t,r) -> t ++ "\n" ++ r ++ "\n"))
(lookupUsersFilmRatings username database)
例如:
ghci> displayUsersFilmRatings "Dave" testDatabase
Title: Casino Royale
Rating: 0
Title: Blade Runner
Rating: 9
Title: Ghost Busters
Rating: unrated
Title: The Fly
Rating: 4
以下是一个运行示例:
ghci> displayRatedFilmsForUser "Garry" testDatabase
Title: Casino Royale
Rating: 8
ghci> displayRatedFilmsForUser "Dave" testDatabase
Title: Blade Runner
Rating: 9
Title: The Fly
Rating: 4
以下是一个运行示例:
ghci> displayRatedFilmsForUser "Garry" testDatabase
Title: Casino Royale
Rating: 8
ghci> displayRatedFilmsForUser "Dave" testDatabase
Title: Blade Runner
Rating: 9
Title: The Fly
Rating: 4
以下是一个运行示例:
ghci> displayRatedFilmsForUser "Garry" testDatabase
Title: Casino Royale
Rating: 8
ghci> displayRatedFilmsForUser "Dave" testDatabase
Title: Blade Runner
Rating: 9
Title: The Fly
Rating: 4
以下是一个运行示例:
ghci> displayRatedFilmsForUser "Garry" testDatabase
Title: Casino Royale
Rating: 8
ghci> displayRatedFilmsForUser "Dave" testDatabase
Title: Blade Runner
Rating: 9
Title: The Fly
Rating: 4
对的谢谢你指出!对的谢谢你指出!对的谢谢你指出!对的谢谢你指出!谢谢你的代码。我真的很感谢你的帮助!但这并不是我想要的。输出的内容应该是用户已经评级的电影的标题以及评级。没有别的了。但是不用担心,如果我把你的代码的总体思想和我的结合起来,我可能会得到一些东西:)再次感谢你的帮助!我用我的输出和示例用法更新了上面的内容。如果这不是你想要的,你能在这里更新你的问题或评论吗?嗨,肖恩,我在你的评论上面评论了更多细节和问题。谢谢你的例子中我所缺少的是结果之间的一条额外的换行线?是的,结果之间有一条额外的换行线。(“\n标题:”++title++“\n分级:”++(显示分级)+++“\n”)感谢您的代码。我真的很感谢你的帮助!但这并不是我想要的。输出的内容应该是用户已经评级的电影的标题以及评级。没有别的了。但是不用担心,如果我把你的代码的总体思想和我的结合起来,我可能会得到一些东西:)再次感谢你的帮助!我用我的输出和示例用法更新了上面的内容。如果这不是你想要的,你能在这里更新你的问题或评论吗?嗨,肖恩,我在你的评论上面评论了更多细节和问题。谢谢你的例子中我所缺少的是结果之间的一条额外的换行线?是的,结果之间有一条额外的换行线。(“\n标题:”++title++“\n分级:”++(显示分级)+++“\n”)感谢您的代码。我真的很感谢你的帮助!但这并不是我想要的。输出的内容应该是用户已经评级的电影的标题以及评级。没有别的了。但是不用担心,如果我把你的代码的总体思想和我的结合起来,我可能会得到一些东西:)再次感谢你的帮助!我用我的输出和示例用法更新了上面的内容。如果这不是你想要的,你能在这里更新你的问题或评论吗?嗨,肖恩,我在你的评论上面评论了更多细节和问题。谢谢你的例子中我所缺少的是结果之间的一条额外的换行线?是的,结果之间有一条额外的换行线。(“\n标题:”++title++“\n分级:”++(显示分级)+++“\n”)感谢您的代码。我真的很感谢你的帮助!但这并不是我想要的。输出的内容应该是用户已经评级的电影的标题以及评级。没有别的了。但是不用担心,如果我把你的代码的总体思想和我的结合起来,我可能会得到一些东西:)再次感谢你的帮助!我用我的输出和示例用法更新了上面的内容。如果这不是你想要的,你能在这里更新你的问题或评论吗?嗨,肖恩,我在你的评论上面评论了更多细节和问题。谢谢你的例子中我所缺少的是结果之间的一条额外的换行线?是的,结果之间有一条额外的换行线。(“\n标题:”++title++“\n评级:”++(show rating)+++“\n”)我没有完全重写我的原始答案,而是从OP中选取了最新的编辑,并做出了直接回应。对不起,如果这是一个糟糕的形式。非常感谢肖恩,我会检查它,我会让你知道很快!谢谢Sean检查了你的代码,这正是我要找的。当我尝试将您的代码导入到我的程序时,我遇到了另一个问题。你能看一下关于我原始问题的最后一个编辑部分吗?我真的很感谢你的帮助!我刚想出来。再次感谢肖恩,你是个救命恩人!我没有完全重写我的原始答案,而是从OP中选取了最新的编辑,并做出了直接的回应。对不起,如果这是