2017-01-04 7 views
1

ハスケルにxsのリストをバンドルしてサイズnのリストに束縛する関数を書こうとしています。 bundle 3 [1..10]の結果は[[1,2,3],[4,5,6],[7,8,9],[10]]である必要があります。ハスケルで値をセット長リストに束ねるには?

私はタイプが

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

ことと

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

のようなものを満足する必要があるが、私は実際にそれを実装しようとしてきたときに、私は動けなくなるはずです知っています。私はfoldlを使用する必要があると思うが、どの機能を適用するかは考えられない。

+1

その後、 'foldl'(該当する場合で、すべて)を使用し、まずあなた自身の再帰で試してみてください:パッケージsplitは正確に同じことをフィッティング関数chunksOfを提供します。 – 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要素を持つペアを返します。最後のリストエントリ以外はすべてそのように作成されるため、2番目のプロパティが保持されます。最初の特性は明白な理由のために保持されます。

ただし、これらの「バンドル」は通常「チャンク」と呼ばれます。

import Data.List.Split (chunksOf) 

bundle :: Int -> [a] -> [[a]] 
bundle = chunksOf 
関連する問題