OCaml中如何用append合并列表内子列表?含特殊场景需求
OCaml 子列表合并问题解决
你的需求是把列表中的整数子列表合并成一个包含合并结果的列表,同时处理几个特殊场景:
[[1];[2];[3]]→[[1;2;3]][]→[[]][[]]→[]
先看你写的代码问题:
let rec ls (l : 'a list list) = match l with | [] -> [] | x :: y -> l@y
这段逻辑完全偏离需求:
- 匹配空列表返回
[],不符合你要求的[] → [[]]; x :: y分支里用l@y,相当于把整个输入列表和剩余列表拼接,比如输入[[1];[2]]会得到[[1];[2];[2]],完全不是合并子列表的逻辑。
正确实现
我们可以分成两步:先递归合并所有子列表,再根据输入的特殊情况处理外层包装:
let merge_sublists lst = (* 递归合并所有子列表为一个列表 *) let rec concat_all = function | [] -> [] | sublist :: rest -> sublist @ concat_all rest in match lst with | [] -> [[]] (* 输入为空列表时返回包含空列表的列表 *) | _ -> let merged = concat_all lst in (* 如果合并后的列表为空(比如输入全是空子列表),返回空列表;否则返回包裹合并结果的列表 *) if merged = [] then [] else [merged]
测试示例
merge_sublists [[1];[2];[3]]→[[1;2;3]]merge_sublists []→[[]]merge_sublists [[]]→[]merge_sublists [[], [1], []]→[[1]]
如果你想直接用OCaml内置函数简化,也可以用List.concat代替自己写的concat_all,代码会更简洁:
let merge_sublists lst = match lst with | [] -> [[]] | _ -> let merged = List.concat lst in if merged = [] then [] else [merged]
内容的提问来源于stack exchange,提问作者CIC
相关产品推荐
相关产品推荐

