2016-11-09 3 views
0

Я кодирую в haskell и хочу знать, как найти определенный элемент в списке mutiple.Как напечатать определенный элемент в каждом списке

Вот пример скажет:

x = [(1,2,3,4,5), 
     (3,4,5,6,6), 
     (5,6,2,1,1), 
     (1,2,5,6,2)]; 

Пусть говорит, что я хочу, чтобы найти 3-й элемент каждого списка.

Так что программа напечатает 4,6,1,6

Я знаю о !! но когда я делаю что-то вроде x !! 3, он печатает третий ряд (1,2,5,6,2).

Я хочу, чтобы он распечатывал третий элемент каждого списка.

+1

Вы действительно не хотите иметь список списков? Прямо сейчас у вас есть список кортежей. В стороне, нет никакого общего пути в Haskell для извлечения элементов из заданных кортежей и индекса. Лучшее, что вы можете сделать, это «map (\ (_, _, _, e, _) -> e) x'. – Alec

+0

так 'x !! 3' получит третий индекс 'x', а не третий индекс каждого элемента' x'? Как применить функцию к каждому элементу списка? – bheklilr

+0

@Alec theres не может пройти через каждый список и получить определенный элемент? –

ответ

7

То, что вы предоставили, на самом деле не список списков, а список кортежей. Кортежи имеют специальный тип, основанный на количестве и типе их элементов, поэтому тип вашего x выше - [(Int,Int,Int,Int,Int)].

В отличие от списков, которые позволяют нам извлечь значения по индексу с !! оператора (напр. [1,2,3] !! 1 = 2), для того, чтобы извлечь конкретные значения из кортежа мы должны шаблон соответствовать весь кортеж, что дает некоторое имя значение, которое мы хотим извлекать и использовать его в нашем возвратном значении. Чтобы извлечь четвертое значение из кортежа проведения 5 значений, мы могли бы написать такую ​​функцию:

f (a,b,c,d,e) = d 

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

(\(a,b,c,d,e) -> d) 

Поскольку мы заботимся только о четвертом значении, мы можем выбрать, чтобы отказаться от всех остальных (вы сказали, третий, но означало индекс 3 -> термин четвёртую выше) :

(\(_,_,_,x,_) -> x) 

Теперь у нас есть список таких кортежей, и мы захотим применить их к каждому. Мы можем сделать это с map, который будет применять функцию к каждому и возвращают список третьего значения из каждого кортежа:

f xs = map (\(_,_,_,x,_) -> x) xs 

Или с ЭТИМИ-сокращениями: использование

f = map (\(_,_,_,x,_) -> x) 

Примера:

gchi>> f [(1,2,3,4,5),(3,4,5,6,6),(5,6,2,1,1),(1,2,5,6,2)] 
[4,6,1,6] 
Смежные вопросы