Разделить лист в хаскеле по условию

Нужно поделить list на несколько частей, так что бы в первой части был 1 элемент, во второй - 2, в n-той n элементов. Как это можно сделать?

Например: [1,2,3,4,5,6,7,8,9] -> [1], [2,3], [3,4,5], [6,7,8,9]


Ответы (2 шт):

Автор решения: extrn

Вариантов много. Например, можно составить список ключей

Prelude> keys = [1 ..] >>= replicate <*> id
Prelude> take 30 keys
[1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8]

После совместить его поэлементно с вашим списком с помощью zip, сгруппировать по ключу с помощью groupBy, и снова отбросить ключи

→ Ссылка
Автор решения: Юрий Козлов

Вариант без использования вспомогательного списка ключей:

sec :: [Int] -> [[Int]]
sec x = helper 1 x

helper :: Int -> [Int] -> [[Int]]
helper n x = if ( e == []) then [x]
                          else s : helper (n+1) e
            where (s, e) = (take n x, drop n x)

Функция sec решает Вашу задачу

→ Ссылка