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

Haskell列表分段:如何生成指定格式的分段列表?

解决方案

要得到你预期的分段顺序,需要调整子段的生成逻辑:预期输出是按子段结束位置递增排列,每个结束位置下的子段按长度从长到短排列,同时开头包含空列表。

方法一:直接生成目标顺序(简洁版)

利用列表推导式,按结束位置分组生成子段,再拼接空列表:

f3 :: [a] -> [[a]]
f3 xs = [] : concat [ [ take (k - s + 1) (drop s xs) | s <- [0..k] ] | k <- [0..length xs - 1] ]

测试输入f3 [0,1,2,3],将输出:
[[],[0],[0,1],[1],[0,1,2],[1,2],[2],[0,1,2,3],[1,2,3],[2,3],[3]]

方法二:基于排序的实现(逻辑清晰版)

先生成所有非空子段,再按「结束位置从小到大,长度从大到小」的规则排序,最后添加空列表:

import Data.List (sortBy)

f3 :: [a] -> [[a]]
f3 xs = [] : map (\(_,_,seg) -> seg) sortedSegments
  where n = length xs
        -- 为每个子段标记排序键:(结束位置, -长度)
        segmentsWithKey = [ (s + l - 1, -l, take l (drop s xs)) 
                          | l <- [1..n]    -- 子段长度从1到列表长度
                          , s <- [0..n-l] -- 起始位置范围
                          ]
        -- 按结束位置升序,长度降序排序
        sortedSegments = sortBy (\(a,b,_) (c,d,_) -> compare (a,b) (c,d)) segmentsWithKey

原代码问题分析

你的inits_函数生成的是从长到短的前缀(不含空列表),segments函数将每个后缀的这类前缀直接拼接,导致输出是长段在前、短段在后,且缺少空列表,与预期顺序不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:55:29