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中选取了最新的编辑,并做出了直接的回应。对不起,如果这是