求助:F#中三元组列表的递归转置函数报错,请求排查问题
问题分析与修复
你的代码报错核心是递归终止条件(base case)的类型不匹配:
- 你写的
[] -> [[], [], []],这个表达式的类型是('a list * 'b list * 'c list) list——本质是一个只装了一个三元组的列表,这个三元组由三个空列表构成。 - 而递归分支返回的
[a::d; b::e; c::f]是'a list list类型——是由三个独立列表组成的列表。
两种分支返回的类型完全不兼容,这才触发了你看到的类型错误。
修复后的代码
把base case改成三个空列表组成的列表,同时可以简化递归分支的模式匹配(因为base case已经保证返回的是三个元素的列表):
let rec transpose LT = match LT with | [] -> [[]; []; []] | (a, b, c) :: tail -> let [d; e; f] = transpose tail [a::d; b::e; c::f]
验证示例
调用transpose [ (1, 2, 3); (11, 12, 13) ]会得到预期结果:[[1; 11]; [2; 12]; [3; 13]]。
额外说明
这段代码专门针对三元组列表的转置场景,核心要求是递归的所有分支必须返回相同类型——当输入是(int*int*int) list时,返回类型为int list list,这样类型检查器就不会报错了。
内容的提问来源于stack exchange,提问作者Hưng Nguyễn Duy
相关产品推荐
相关产品推荐

