2013-04-20 6 views
0

나는 문제가이 주어진 데이터베이스에서 정보의 특정 비트를 출력하는 데 :하스켈 높은 주문 기능

type Title = String 
type Actor = String 
type Cast = [Actor] 
type Year = Int 
type Fan = String 
type Fans = [Fan] 
type Period = (Year, Year) 
type Film = (Title, Cast, Year, Fans) 
type Database = [Film] 

testDatabase :: Database 
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green", "Judi Dench"], 2011, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]), 
    ("Cowboys & Aliens", ["Harrison Ford", "Daniel Craig", "Olivia Wilde"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),  
     ("Catch Me If You Can", ["Leonardo DiCaprio", "Tom Hanks"], 2006, ["Zoe", "Heidi", "Jo", "Emma", "Liz", "Sam", "Olga", "Kevin", "Tim"])] 

참고 :이 때문에리스트의 크기로 데이터베이스의 일부입니다.

사용자가 연도를 입력하고 영화 제목 만 출력하도록 허용하는 기능을 작성하려고합니다. 사용자가 팬 이름을 입력하고 출력 한 팬과 유사한 것을 수행했습니다. 이에 대한 코드는 다음과 같습니다 ...의 팬 :

filmsByFan y = map (\(a,_,_,_) -> a) $ filter (\(_,_,_,a) -> elem y a) testDatabase 

이 100 % 작동하고, 그래서 byYear와 비슷한 하나의 시도 :

filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> elem y a) testDatabase 

을하지만이 컴파일되지 않습니다 .. 이것은 Year 유형이 Int로 설정 되었기 때문입니까? 그렇다면 비슷한 방식으로 내 문제에 대한 해결책이 있습니까?

미리 감사드립니다.

답변

2

첫 번째 경우 y인지 확인하려면 팬 목록에이 포함되어 있으므로 elem y a입니다. 두 번째 경우

, 당신은 올해 y이 영화의 년 동일한 있는지 여부를 확인하려면, 그래서 당신은 단순히 평등에 대한 a == y을 확인합니다 :

filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> a == y) testDatabase 
덧붙여,이 코드를 더 쉽게 읽을 수 있습니다.

title (t, _, _, _) = t 
fans (_, _, _, fs) = fs 
year (_, _, y, _) = y 

그리고 더 사용법이 좋습니다. 기능 체인 : 지금

filmsByFan f = map title $ filter (elem f . fans) testDatabase 
filmsByYear y = map title $ filter ((== y) . year) testDatabase 

는 자체가 잘 고차 기능에 캡처 할 수있는 패턴을 얼룩을지게 될 수는 :

filmsBy func = map title $ filter func testDatabase 
filmsByFan f = filmsBy (elem f . fans) 
filmsByYear y = filmsBy ((== y) . year) 
+0

나는 코드를 수정했지만이 나는 오류입니다 get -------------------- (Eq ([Year] -> Bool))에 대한 인스턴스가 없습니다. 사용시 발생하는 가능한 수정 : add 다음 표현식에서 elem a == y 필터의 첫 번째 인수 인 '(\ (_, _, a, _) -)에 대한 인스턴스 선언은 (Eq ([Year] > elem a == y) ' '($)'의 두 번째 인수, 즉 'filter (\ (_, _, a, _) -> elem a == y) testDatabase ' – user2240649

+0

테스트를 마쳤습니다. 그것은 작동합니다. 어떻게 함수를 부르니? – Thomas

+0

걱정 마세요, 지금 작동 중입니다! 귀하의 의견에 대해 대단히 감사합니다! – user2240649