Извлечение элементов списка между списками в Haskell - PullRequest
0 голосов
/ 26 мая 2011

У меня есть следующий список:

[[a,b,c],
 [d,e,f],
 [g,h,i]]

и хотел бы получить следующее (например, если я извлеку 0-й элемент списка в списке):

[[a],[d],[g]]

Мне удалось сделать это для одного элемента (например, ([[a,b,c],[d,e,f],[g,h,i]])!!0!!0 = a), но я не могу заставить эту функцию работать для всех элементов в этом столбце.

Ответы [ 3 ]

5 голосов
/ 26 мая 2011

Вы уже знаете, что можете использовать !! i, чтобы получить i-й элемент списка.Так как же получить i -й элемент каждого списка в списке списков?Применяя (!! i) к каждому списку в списке списков.И как ты это делаешь?Используя map, который может применять любую функцию к каждому элементу в списке.

Таким образом, используя map с (!! i), мы получаем список, содержащий i-й столбец каждой строки, чтобыть [a, d, g] в вашем примере.Отсюда вы можете легко получить ожидаемый результат.

Хотя, если вы хотите получить доступ к своей матрице по столбцам, вам может быть лучше транспонировать свою матрицу один раз, а затем использоватьтранспонированная матрица.

3 голосов
/ 26 мая 2011

Чтобы извлечь первый элемент списка, вы можете использовать функцию head, поэтому, если вы хотите извлечь первые элементы списков, содержащихся в списке, вы должны написать

extract_first :: [[a]] -> [a]
extract_first = map head
0 голосов
/ 26 мая 2011

вы можете написать вторую функцию, чтобы получить вторую часть списка, и использовать классную карту snd '!

snd' :: [a] -> a
snd' [] = error "can't call the second on an empty list!"
snd' [x] = error "can't call the second when the list has only one value!"
snd' (_:x:_) = x
...