You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 09:15:09