Как объединить список списков со списком списков - PullRequest
4 голосов
/ 05 ноября 2019

У меня есть списки списков, и мне нужно объединить их с другим списком списков. Пример входных данных: A: [[1,2], [3,4], [5,6], [7,8]] B: [[1,2], [3,4], [5,6], [7,8]]

Пример вывода: [[1,2,1,2], [1,2,3,4], .., [7,8,5,6],[7,8,7,8]]

2 списка списков с 4 списками внутри обоих вернули бы нам список списков размером 4 * 4 = 16

Я пробовал только рекурсивнообъединить списки, но я знаю, что это не будет работать, даже если бы пройти.

  mergeAll [[]] [[]] = [[]]
  mergeAll [[]] b = b
  mergeAll a [[]] = a
  mergeAll xs ys = mergeAll (merge xs ys) (drop 1 ys) 

  merge :: [[a]] -> [[a]] -> [[a]]
  merge [[]] [[]] = [[]]
  merge xs [[]] = xs
  merge [[]] ys = ys
  merge (x:xs) (y:ys)  = ((x++y):xs)

Ответы [ 3 ]

4 голосов
/ 05 ноября 2019

Вы можете использовать понимание списка:

[ xs ++ ys | xs <- listOfLists1, ys <- listOfLists2 ]
1 голос
/ 05 ноября 2019

Вы можете сделать как

Prelude> let doit = \as bs -> as >>= \a -> bs >>= \b -> pure (a ++ b)
Prelude> doit [[1,2],[3,4],[5,6],[7,8]] [[1,2],[3,4],[5,6],[7,8]]
[[1,2,1,2],[1,2,3,4],[1,2,5,6],[1,2,7,8],[3,4,1,2],[3,4,3,4],[3,4,5,6],[3,4,7,8],[5,6,1,2],[5,6,3,4],[5,6,5,6],[5,6,7,8],[7,8,1,2],[7,8,3,4],[7,8,5,6],[7,8,7,8]]
0 голосов
/ 06 ноября 2019

Как говорит Робин в комментарии, вы также можете сделать это следующим образом:

liftA2 (++)

Я задаю себе вопрос , пытаясь понять, почему это эквивалентно:

[xs ++ ys | xs <- xss, ys <- yss]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...