2014-03-13 1 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

, 사용자 == existingUser)', [그렇게] (https://gist.github.com/bheklilr/08b4ffbfcf6bbfa34af0). – bheklilr

+0

감사합니다. 매우 유용합니다. 훨씬 좋은 코드를 찾고 있습니다. :) – AlexJonBarry

답변

3
  1. 당신은 정말, 정말 당신이 거기에 무슨 모르면 목록 모나드에서 작동하지 않습니다. 목록 모나드는 비 결정적 계산을위한 것입니다. wikibook section 또는 applicative section of the typeclassopedia을 참조하십시오.
  2. 평점에서 (existingUser, score)이 아니라 (user, number)을 제거하고 싶습니다.

Alltogether 우리는 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 
경우 문이 제목 == 이름 (`에 사용 된 경우이 코드는 (IMO) 더 읽기를 많이 만들어 질 수
관련 문제