あなたはリストのリストとして表現「マトリックス」にHaskellのリストとして表さ「ベクター」を回す意味と仮定すると、慣用的な解決策がするそうです恥ずかしいエンドレスループを回避するためにガードとおそらく
chunksOf :: Int -> [a] -> [[a]]
chunksOf _ [] = []
chunksOf n xs =
let (row, rest) = splitAt n xs
in row : chunksOf n rest
:簡単なパターンマッチングと再帰を使用して行EITHERのリストを構築し、各行を断つためにsplitAt
を使用
chunksOf :: Int -> [a] -> [[a]]
chunksOf n | n > 0 = chunks
where
chunks [] = []
chunks xs =
let (row, rest) = splitAt n xs
in row : chunks rest
OR ELSEunfoldr
を使用して:
import Data.List
chunksOf :: Int -> [a] -> [[a]]
chunksOf n | n > 0 = unfoldr chunk
where
chunk [] = Nothing
chunk xs = Just (splitAt n xs)
長さが行の長さの倍数でない場合、最終行が残りの部分よりも短くなります。最終的に不完全な行の塗りつぶし文字を許可するには、次のように記述があります
import Data.List
chunksOfWithFill :: Int -> a -> [a] -> [[a]]
chunksOfWithFill n filler | n > 0 = unfoldr chunk
where
chunk xs = case splitAt n xs of
([],[]) -> Nothing
(xs,[]) -> Just (fill xs, [])
result -> Just result
fill xs = take n (xs ++ repeat filler)
@Willネスがコメントで指摘するとおり、chunksOf
はsplit
パッケージのData.List.Split
モジュールですでに利用可能です。
'Data.Vector'の' Vector'を意味していますか?あなたの試行を見せてもらえますか? –
['chunksOf :: Int - > [e] - > [[e]]'](https://hackage.haskell.org/package/split-0.2.3.2/docs/Data-List-Split.html# v:chunksOf)。 –