То, что вы предоставили, на самом деле не список списков, а список кортежей. Кортежи имеют специальный тип, основанный на количестве и типе их элементов, поэтому тип вашего 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]
Вы действительно не хотите иметь список списков? Прямо сейчас у вас есть список кортежей. В стороне, нет никакого общего пути в Haskell для извлечения элементов из заданных кортежей и индекса. Лучшее, что вы можете сделать, это «map (\ (_, _, _, e, _) -> e) x'. – Alec
так 'x !! 3' получит третий индекс 'x', а не третий индекс каждого элемента' x'? Как применить функцию к каждому элементу списка? – bheklilr
@Alec theres не может пройти через каждый список и получить определенный элемент? –