Haskell: изменить список из 100 номеров на 10 списков из 10 номеров?

Как в Haskell можно преобразовать список из x чисел в n списков из n чисел?

Первый подсписок будет иметь номера с первого по десятый, второй список с 11 по 20...

myFunction :: [Int] -> [[Int]]


person Mickael Bergeron Néron    schedule 16.06.2014    source источник


Ответы (2)


В Data.List.Split есть функция chunksOf. :

chunksOf 2 [0, 1, 2, 3] -- [[0, 1], [2, 3]]

В качестве альтернативы у нас уже есть splitAt в prelude, с помощью которого можно легко реализовать chunksOf:

chunksOf :: Int -> [a] -> [[a]]
chunksOf n [] = []
chunksOf n xs = let (as, bs) = splitAt n xs in as : chunksOf n bs
person András Kovács    schedule 16.06.2014
comment
обратите внимание, что в более старых версиях ghc вам нужно «разделить установку клики» (я думаю, до 7.6) - person epsilonhalbe; 17.06.2014
comment
Почему нет эквивалента в Prelude? Я не хочу зависеть от разделенного пакета, если я пишу что-то быстрое и маленькое. - person Alex; 14.02.2016

Может быть немного проще читать с помощью «бери и бросай» и не требует библиотек.

chunksOf :: Int -> [a] -> [[a]]
chunksOf _ [] = []
chunksOf n xs = take n xs : chunksOf n (drop n xs)
person mmachenry    schedule 17.06.2014