Haskell中如何将嵌套列表的内部列表裁剪至最短子列表长度?
解决Haskell嵌套列表裁剪到最短长度的问题
嘿,我来帮你搞定这个问题!你的思路完全没问题——先找到所有内部列表里的最短长度,再把每个列表都裁剪到这个长度。咱们一步步来修正你的代码:
首先,你当前的代码有两个核心问题:
- 你在lambda里用了
min(length xs),但min需要两个参数,而且这里根本没拿到全局的最短长度,只拿到了当前列表的长度,逻辑自然走不通; - 就算拿到了正确的长度,你用
drop的逻辑也反了——drop k是去掉前k个元素,而我们需要保留前N个元素,应该用take N。
正确的实现方式
我们可以分两步走:
- 先计算所有内部列表的长度,取其中的最小值;
- 把每个内部列表都截取前
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
相关产品推荐
相关产品推荐

