2015-10-25 4 views
1

Я новичок в Haskell, и у меня есть несколько проблем. После прочтения функций высокого порядка, я пытался решить несколько упражнений о кортежах.Поиск в списке кортежей

Итак, у меня есть список с кортежей, что-то вроде этого:

list tup = [("James",19,"SB",2),("Patrick",19,"FDF",4),("Jim",20,"CD",3)] 

И одна из проблем было сравнить положение кортежей, например: получить более высокий возраст (SND элемент кортеж), например:

higherAge tup 
>20 

Что я пытался:

higherAge ls = maximum (filter (get2th ls)) 

get2th (_,a,_,_,_) = a 

ответ

2

Вот способ сделать это:

maxAge l = maximumBy (compare `on` (\(a,b,c,d) -> b)) l 

Проблема с вашим решением является то, что вы не используете filter правильно. filter просто удаляет элементы из списка, он может только уменьшить ваш список. Кажется, что вы хотели сделать, это использовать map.

Следующие также должен работать: @rafalio maximum (map get2th) ls

+0

Спасибо, другой вопрос, так что, если я хотел иметь список все 4-й элемент кортежа, можно ли использовать карту тоже? Например: (карта get4th), это должно вернуть список со всем 4-м элементом? – user3680999

+0

Да, это тоже сработает! Вам действительно нужно иметь отдельную функцию для доступа к каждому элементу кортежа, как в Haskell, вы не можете получить произвольный кортеж. Дайте мне знать, если это поможет или вам нужно что-нибудь еще или вы можете принять :) – rafalio