Объединение кортежей, вложенных в список списков [Haskell]

#haskell

#haskell

Вопрос:

Я пытаюсь объединить:

 [[('a',False),('b',False)]]
with
[[('a',True)],[('b',True)]]
 

и получите следующее:

 [[(a,True),(b,True),(a,False),('b',False)]]
 

По сути, объединение двух списков кортежей в один.

Я пытался создать функцию для этого, но я не получаю желаемый результат. Вот моя текущая функция и результат, который она мне дает

 mergeFunc :: [[a]] -> [[a]] -> [[a]]
mergeFunc xs [] = xs
mergeFunc [] ys = ys
mergeFunc (x:xs) ys = x : mergeFunc ys xs

[[('a',True),('b',True)],[('a',False)],[('b',False)]]
 

Кажется, что я объединяю уровень выше, чем я хочу, но я не уверен, как это исправить.

Комментарии:

1. Почему эти списки списков? Что произойдет, если есть другие подсписки?

2. Вот как они были даны. Не могли бы вы привести пример того, что вы подразумеваете под другими подсписками?

3. Что, если первый подсписок есть [[('c',False)],[('d',False)], [('e', False)]] ?

4. хм, в настоящее время я пытаюсь работать только с подсписками длиной 2. Списки создаются при выполнении логических и / или функций для входных данных. Итак, первый список в моем примере был получен из операции «и», а затем второй — из операции «или».

5. но как именно два подсписка отражаются в результате функции? Похоже, что вы объединяете все элементы, а затем добавляете их в новый одноэлементный список.

Ответ №1:

Вы можете объединить подсписки вместе в один список с помощью concat :: Foldable f => f [a] -> [a] :

 mergeFunc :: [[a]] -> [[a]] -> [[a]]
mergeFunc xs ys = [concat xs    concat ys] 

и это приведет к:

 ghci> mergeFunc [[('a',True)],[('b',True)]] [[('a',False),('b',False)]]
[[('a',True),('b',True),('a',False),('b',False)]]
 

Но тогда нет особого смысла оборачивать список в одноэлементный список. В этом случае имеет смысл определить это как:

 mergeFunc :: [[a]] -> [[a]] -> [a]
mergeFunc xs ys = concat xs    concat ys
 

поскольку это удаляет ненужный уровень списка.