список кортежей в список с пониманием списка - PullRequest
0 голосов
/ 08 мая 2018

Есть ли какая-либо функция или метод в Haskell, который помогает мне взять список кортежей, например, [(1,2),(3,4),(5,6)] и
возвращает [1,2,3,4,5,6] и работает с пониманием списка?

Я специально ищу функцию, которая принимает параметры xs и
имеет в теле (функции) понимание списка.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018
concatMap (\(x, y) -> [x, y]) [(1,2),(3,4),(5,6)]

даст

[1,2,3,4,5,6]

Если вы не хотите использовать concatMap, вы можете сделать

concat . map (\(x, y) -> [x, y])
0 голосов
/ 09 мая 2018

Вы можете, конечно, обработать любой список, даже список кортежей в понимании списка.Это форма, которая отличается.Вы видите в двух великих ответах перед этим, форма (a, b) или (x, y).Они оба означают одно и то же.Они означают два элемента в кортеже.Проблема с обработкой формы кортежа состоит в том, что выходные данные представляют собой отдельные списки элементов.Вот почему concat так ценен.

Мне очень нравится понимание списков, и классическая форма для выравнивания списков любого вида с использованием списков приведена выше.

IЯ относительно новичок в Haskell и не мог понять, как fold s может создать список, а не одно значение, например sum или product.

Подобные вопросы неоценимы, потому что они помогают мне понять.

Версия foldr приводит к списку.Список, который вы хотите.Почему это список, а не одно значение?Это потому, что foldr создает серию последовательно все больших и больших списков, последний из которых является ответом.

Вот foldr версия функции для выравнивания списка кортежей.

foldr (\(a,b) l-> a:b:l) []    [(1,2),(3,4),(5,6)]

[1,2,3,4,5,6]

0 голосов
/ 08 мая 2018

Учитывая, что список кортежей называется ts, мы можем выполнить итерацию дважды:

[ t | (a, b) <- ts, t <- [a, b] ]

Таким образом, здесь мы сначала перебираем кортежи (a, b) в ts, затем мы создаем новый список [a, b], и мы также перебираем этот список, и мы получаем t для каждого t в [a, b].

Или с монадой списка без очков:

(>>= uncurry ((. pure) . (:)))
...