Haskell如何不依赖split包借助splitAt按指定长度列表分割目标列表
基于
splitAt实现自定义长度列表分块 splitAt完全适用于该场景,它是Haskell Prelude内置的原生函数,无需引入任何第三方包,正好满足按指定长度切割列表的需求。
实现思路
- 遍历预设的分块长度列表,每次取当前的分块长度n
- 调用
splitAt n将剩余待切割的列表拆分为两部分:长度为n的当前分块、待下一轮切割的剩余后半段 - 将当前分块加入结果集,递归执行上述逻辑,直到分块长度用完或待切割列表为空
代码实现
-- 函数参数:分块长度列表、待分割列表;返回值:分块结果 chunkBy :: [Int] -> [a] -> [[a]] chunkBy [] _ = [] chunkBy _ [] = [] chunkBy (n:ns) xs = let (currentChunk, remaining) = splitAt n xs in currentChunk : chunkBy ns remaining
测试示例
输入:chunkBy [3,1,3] [1,2,3,4,5,6,7]
输出:[[1,2,3],[4],[5,6,7]]
边界处理说明
- 如果分块长度总和大于待分割列表总长度,最后一个分块会自动取剩余所有元素,例如
chunkBy [2,5] [1,2,3]返回[[1,2],[3]] - 如果需要过滤分块长度中的非法值(负数、0),可以调整实现先做参数校验:
chunkBy :: [Int] -> [a] -> [[a]] chunkBy ns xs = go (filter (>0) ns) xs where go [] _ = [] go _ [] = [] go (n:ns') xs' = let (c, r) = splitAt n xs' in c : go ns' r
内容的提问来源于stack exchange,提问作者user15263733
相关产品推荐
相关产品推荐

