2014-03-13 110 views
0

因此,我有一部電影的評級列表,如果新用戶對該電影評級,則會將其添加到列表中。但是,如果現有用戶已對其評級,則再次對其進行評級會導致舊評級更改爲新評級。這是到目前爲止我的代碼:從列表中刪除元素並將其替換爲新值

rateFilm :: String -> String -> Int -> [Film] -> [Rating] 
rateFilm _ _ _ []     = [] 
rateFilm user title number (x:xs) = if title == name then do 
             if user == existingUser then do 
              removeItem (user,number) ratings 
              ratings ++ [(user,number)] 
             else do 
              ratings ++ [(user,number)] 
           else do 
            rateFilm user title number xs 
           where (name, director, year, ratings) = x 
             (existingUser,score)   = getUser user ratings 

removeItem :: Rating -> [Rating] -> [Rating] 
removeItem _ [] = [] 
removeItem x (y:ys) | x == y = removeItem x ys 
       | otherwise = y : removeItem x ys 

而對於影片中的信息是這樣的:

[("Blade Runner","Ridley Scott",1982,[("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4)]), 
("The Fly","David Cronenberg",1986,[("Megan",4),("Fred",7),("Chris",5),("Ian",0),("Amy",5)]), 
("Psycho","Alfred Hitchcock",1960,[("Bill",4),("Jo",4),("Garry",8),("Kevin",7),("Olga",8),("Liz",10),("Ian",9)]), 
("Body Of Lies","Ridley Scott",2008,[("Sam",3),("Neal",7),("Kevin",2),("Chris",5),("Olga",6)])] 

當新用戶增加了一個評價它是好的,輸出會是這樣:

rateFilm "Alex" "Blade Runner" 8 testDatabase1 
[("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Alex",8)] 

然而,當現有的用戶這樣做,出現這種情況:

rateFilm "Amy" "Blade Runner" 8 testDatabase1 
[("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8), 
("Amy",6),("Bill",9),("Ian",7),("Kevin",9),("Emma",4),("Sam",5),("Megan",4),("Amy",8)] 

關於爲什麼和/或如何解決它的任何想法?非常感激。

+0

這個代碼可以做了很多更具可讀性(IMO)如果一個case語句中的'(標題==名稱中使用,用戶== existingUser )',[像這樣](https://gist.github.com/bheklilr/08b4ffbfcf6bbfa34af0)。 – bheklilr

+0

謝謝,非常有幫助,現在有更多更好看的代碼:) – AlexJonBarry

回答

3
  1. 你真的,真的不想除非你知道在那裏發生的事情就行了單子操作。列表monad用於非確定性計算。請參閱wikibook sectionapplicative section of the typeclassopedia
  2. 您想從你的評分中刪除(existingUser, score)而非(user, number)

產品總數我們獲得了爲rateFilm如下:

rateFilm user title number (x:xs) = 
    if title == name then 
     if user == existingUser then 
      removeItem (user,score) ratings ++ [(user,number)] 
     else 
      ratings ++ [(user,number)] 
    else 
     rateFilm user title number xs 
    where (name, director, year, ratings) = x 
      (existingUser, score)   = getUser user ratings