Haskell превращает список кортежей в список списков - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь превратить список кортежей в список списков.Например, если у меня есть список [(9,1), (6,3), (4,1)], он превратится в [[9, 6, 4],[6],[6]].Происходит то, что в списке кортежей [(a,b)], a представляет число от 0 до 9, а b представляет вхождение этого числа, a всегда будет уникальным.

Что яя пытаюсь это сделать, пройдите по списку n раз, где n = maximum b in the list of tuples. Каждый раз, когда я перехожу по списку, я беру a и помещаю его в список, затем уменьшаю b на 1. Если b == 0 тогда я просто пропущу это.

Итак, из моего примера я беру [9,6,4] и выбрасываю их в список, затем уменьшаю b каждого из них, так что теперь список будет выглядеть как [(9,0),(6,2),(4,0)].Затем, возвращаясь снова, я беру [6], список кортежей теперь выглядит как [(9,0), (6,1), (4,0)].Наконец, возьмите [6] в последний раз, и теперь b в списке кортежей равно 0, так что все готово.

Я создал функцию, которая берет 1-й элемент из спискакортежи, если b is> = 1, но я не знаю, как я могу повторить это по обновленному списку со всеми `b - 1 'для каждого кортежа.

turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = []
turnIntList x = ([map (\(a, b) -> case (a,b) of  _ | b >= 1 -> a | otherwise -> -1) x])

Я также пытался создатьдругая вспомогательная функция, которая принимает список кортежей и превращает их в список в зависимости от размера b.Из основной функции я бы попытался отправить [(a, 1), (b, 1) ...] для создания списка, а затем следить за уменьшением b здесь, пока это не будет сделано.Итак, для этой функции:

pairingL :: [(Integer, Integer)] -> [Integer] -> [Integer]
pairingL ((a,b):xs) l -- = if b /= 0 then [a,b-1] else []
    | null xs = if b == 1 then [a] ++ l else if b > 1 then [a] ++ l ++ pairingL [(a,b-1)] l else l
    | otherwise = 
        if b /= 0 then [a] ++ l ++ pairingL ((a,b-1):xs) l else pairingL xs l


pairingL [(9,1), (7,2), (5,1)]
[9,7,7,5]

pairingL [(1,1), (2,1), (3,1)]
[1,2,3]

pairingL [(1,2), (2,2), (3,2)]
[1,1,2,2,3,3]

Я попытался разархивировать список и поработать с этим, повторить и повторить, но я не могу понять, как заставить функцию пройти по спискунесколько раз и обновляя список новыми b значениями, а затем снова.

В заключение я пытаюсь сделать что-то вроде:

    turnIntList [(9,3),(5,1),(2,1)]
    [[9,5,2],[9],[9]]

    turnIntList [(1,1),(2,1),(3,1),(4,1)]
    [[1,2,3,4]]

    turnIntList [(1,2),(2,2),(3,2)]
    [[1,2,3],[1,2,3]]

    turnIntList [(4,2),(6,1)]
    [[4,6],[4]]

Процесс: Я беру первый элемент из кортежей, добавляю их в список, затем вычитаю второй элемент на 1. После этого для каждого кортежа в списке я повторяю процесс, пока все вторые элементы для каждого кортежа не будут0

Важные примечания: опять же, в списке кортежей [(a, b)], a ВСЕГДА будет УНИКАЛЬНЫМ числом от 0-9, а b >= 0

1 Ответ

2 голосов
/ 07 апреля 2019

Это может быть

turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = [] -- if it doesn’t compile use [[]]
turnIntList ls = [i | (i, _) <- ls] : turnIntList [(i, n - 1) | (i, n) <- ls, n - 1 > 0]
...