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

Haskell中如何将嵌套列表的内部列表裁剪至最短子列表长度?

解决Haskell嵌套列表裁剪到最短长度的问题

嘿,我来帮你搞定这个问题!你的思路完全没问题——先找到所有内部列表里的最短长度,再把每个列表都裁剪到这个长度。咱们一步步来修正你的代码:

首先,你当前的代码有两个核心问题:

  • 你在lambda里用了min(length xs),但min需要两个参数,而且这里根本没拿到全局的最短长度,只拿到了当前列表的长度,逻辑自然走不通;
  • 就算拿到了正确的长度,你用drop的逻辑也反了——drop k是去掉前k个元素,而我们需要保留前N个元素,应该用take N。

正确的实现方式

我们可以分两步走:

  1. 先计算所有内部列表的长度,取其中的最小值;
  2. 把每个内部列表都截取前minLen个元素。

对应的Haskell代码如下:

cut :: [[a]] -> [[a]]
cut [] = []  -- 处理空输入的边界情况
cut xss = let minLen = minimum (map length xss)
          in map (take minLen) xss

代码解释

  • map length xss:把嵌套列表里的每个内部列表转换成它的长度,比如输入[[1,2,3,4],[2,3],[3,9]]会得到[4,2,2];
  • minimum (...):从长度列表里取出最小值,这里就是2;
  • map (take minLen) xss:对每个内部列表执行take minLen,也就是保留前minLen个元素,最终得到[[1,2],[2,3],[3,9]],完全符合你的预期。

测试边界情况

  • 如果输入里有空列表,比如[[],[1,2,3]],minimum会取到0,最终所有列表都会被裁剪成空列表[[],[]],这是合理的;
  • 如果输入是空的嵌套列表[],我们的代码直接返回[],避免了minimum报错的问题。

内容的提问来源于stack exchange,提问作者Janik Ti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:16