Разделить лист в хаскеле по условию
Нужно поделить 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 решает Вашу задачу