我有一个整数向量,我想将其转换为二维矩阵。保证输入可以被行大小整除。在Haskell中最常用的方法是什么?
在Python中我会这样做:
# Taken from itertools docs.
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
m = list(grouper(v, n))
答案 0 :(得分:1)
假设你的意思是转向&#34;向量&#34;将Haskell列表表示为&#34;矩阵&#34;表示为列表列表,然后一个惯用的解决方案可能会使用<li data-time="3:07">Flexbox Video</li>
<li data-time="5:59">Redux Video</li>
来中断每一行,使用简单的模式匹配和递归构建行 EITHER 的列表:
splitAt
可能有一个警卫,以避免令人尴尬的无休止的循环:
chunksOf :: Int -> [a] -> [[a]]
chunksOf _ [] = []
chunksOf n xs =
let (row, rest) = splitAt n xs
in row : chunksOf n rest
OR ELSE 使用chunksOf :: Int -> [a] -> [[a]]
chunksOf n | n > 0 = chunks
where
chunks [] = []
chunks xs =
let (row, rest) = splitAt n xs
in row : chunks rest
:
unfoldr
如果长度不是行长度的倍数,则最后一行将比其余行短。要允许最后一个不完整行的填充字符,您可以写:
import Data.List
chunksOf :: Int -> [a] -> [[a]]
chunksOf n | n > 0 = unfoldr chunk
where
chunk [] = Nothing
chunk xs = Just (splitAt n xs)
正如@Will Ness在评论中指出的那样,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)
包的chunksOf
模块中已经提供了Data.List.Split
。