2013-04-22 2 views
0

У меня есть список фильмов в базе данных.Как фильтровать Результаты для правильного отображения

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

Что я хочу, чтобы узнать, какой фильм из моего списка.

Функция One

  • имеет наиболее Фанаты
  • фильтруется определенным именем актеров.

Функция Два

  • Общий топ-5 фильмов (по количеству поклонников)
  • По убыванию По

Я в настоящее время есть два фрагмента кода, который я либо пытаюсь сделать работу вместе. Или найти более гуманного:

inCast :: Actor -> Film -> Bool 
inCast givenActor (_, cast, _, _) = any (\actor -> actor == givenActor) cast 

и

import Data.List 
import Data.Ord 

bestFilm :: Database -> Film 
bestFilm = maximumBy $ comparing (length . fans) 

я буду полностью неправильный путь об этом?

Большое спасибо за любую помощь заранее.

EDIT: дополнительный код, который у меня есть. Я не могу использовать его, хотя, чтобы помочь мне решить эту часть. Любые идеи?

filmsWithFan :: Fan -> [Film] 
filmsWithFan givenFan = filter (isFan givenFan) testDatabase 
+0

Это вопрос домашнего задания? Был такой же опубликованный вчера: http://stackoverflow.com/questions/15789061/film-database-in-haskell. Если это домашнее задание, пометьте его как таковой. Это также причина, по которой я просто даю вам подсказки, а не весь ответ. Это то, о чем вы, похоже, просите. – mck

ответ

3

Я думаю, что вы определенно находитесь на правильном пути. Хотя последняя функция, filmsWithFan, в данном случае вам не поможет. Я дам вам несколько подсказок:

Функции 1:

думать о типе подписи вы хотите иметь для функции первого:

topByFanAndActor :: Actor -> Database -> Film 
topByFanAndActor actor films = undefined 

Подумайте о том, как вы можете объединить два функции, которые вы предоставили, в основном inCast и bestFilm для достижения такой подписи. Вам определенно нужно будет использовать функцию более высокого порядка, которая обрабатывает списки. Если вам понадобится еще один намек, я могу сказать, какая функция будет.

EDIT:

Так что вам нужно, чтобы преобразовать список поддавки films в список фильмов, заданные actor звезды в Чтобы сделать это, вам нужно filter этот список, используя вашу функцию inCast..Затем вам нужно извлечь фильм с максимальным количеством поклонников из этого списка, для этого вы будете использовать bestFilm.

Функция 2:

В этом случае тип подписи будет довольно просто:

topFiveDesc :: Database -> Database 

, но вы можете сделать это немного лучше, если вы сделаете несколько фильмов вернуть переменную:

topDesc :: Database -> Int -> Database 
topDesc films num = undefined 

Подумайте о том, что именно вы должны делать с фильмами. Вам нужно отсортировать его по определенному критерию (количество поклонников). Критерий, определенный аналогично критерию bestFilm. А потом вам нужно снять первые фильмы num из этого списка.

+0

ОК, так как это выглядит как домашнее задание, я не дам вам полного ответа на оба вопроса. Выберите тот, на котором вы хотите, чтобы я уточнил, и я уверен, что вы получите второй после этого. – mck

+0

Хорошо, я его отредактировал. Посмотрите сейчас и посмотрите, поможет ли это. – mck

+0

Я добавил ссылку на 'фильтр', если вы боретесь с этим. – mck

Смежные вопросы