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
相关产品推荐
相关产品推荐

