2017-01-04 10 views
1

Пытается написать функцию в Haskell, которая связывает список xs в списки размера n, например. результат bundle 3 [1..10] должен быть [[1,2,3],[4,5,6],[7,8,9],[10]].Как объединить значения в списки заданных длин в Haskell?

Я знаю, что тип должен быть

bundle :: Int -> [a] -> [[a]] 

и должен удовлетворять что-то вроде

concat $ bundle n xs == xs 
length xss > 1 ==> all (\xs -> n == length xs) (init xss) 

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

+1

Try с собственным рекурсии первого, а затем использовать 'foldl' (если применимо на всех). – Bergi

+2

Вы можете использовать 'unfoldr' вместе с' splitAt'. – Lee

+4

http://hackage.haskell.org/package/split-0.2.3.1/docs/Data-List-Split.html#v:chunksOf – melpomene

ответ

2

Ну, вы можете использовать splitAt, например.

bundle :: Int -> [a] -> [[a]] 
bundle _ [] = [] 
bundle n xs = as : bundle n bs 
    where (as, bs) = splitAt n xs 

однако, вы должны убедиться, что n является положительным, в противном случае вы будете в конечном итоге с бесконечным списком пустых списков. Эта функция сохраняет ваши свойства: splitAt n возвращает пару, где первая часть кортежа имеет точно n элементов. Поскольку все, кроме последней записи списка, создаются таким образом, ваше второе свойство сохраняется. Первое свойство выполняется по понятным причинам.

Однако эти «пучки» обычно называются «кусками». Пакет split обеспечивает функцию фитинг chunksOf, который делает точно то же самое:

import Data.List.Split (chunksOf) 

bundle :: Int -> [a] -> [[a]] 
bundle = chunksOf 

 Смежные вопросы

  • Нет связанных вопросов^_^