В этом примере видно, как важно точно описать проблему не только для других, но и для самого себя.
Вы хотите строки из первого списка, чье связанное целое число встречается во втором списке.
При таких проблемах важно делать решения небольшими шагами. Чаще всего никто не может написать функцию, которая делает это сразу, но это то, что многие новички считают, что они должны делать.
Начните с написания сигнатуры типа, необходимой для вашей функции:
findFirsts :: [(String, Integer)] -> [(Float, Integer)] -> [String]
Теперь, из описания проблемы, мы можем сделать вывод, что нам, по сути, нужно сделать две вещи:
- Преобразование списка (String, Integer) в список String
- Выберите записи, которые мы хотим.
Следовательно, основной каркас нашей функции выглядит следующим образом:
findFirsts sis fis = map ... selected
where
selected = filter isWanted sis
isWanted :: (String, Integer) -> Bool
isWanted (_,i) = ....
Вам понадобятся функции fst
, elem
и snd
для заполнения пустых мест.
Примечание: лично я предпочел бы решить эту проблему с помощью понимания списка, что часто приводит к более удобочитаемому (для меня, во всяком случае) коду, чем комбинация карты и фильтра с нетривиальными критериями фильтрации.