F#:如何过滤元组列表中第二个元素为空的项?解决模式匹配问题
解决F#元组列表过滤及模式匹配问题
你的代码有两个核心问题:
- 误用
List.map:map要求每个输入元素都对应一个输出值,但你需要过滤掉不符合条件的项,应该用List.filter(它通过返回布尔值决定是否保留元素)。 - 模式匹配不完整:
filterEmpty只处理了元组第二个元素非空的情况,F#要求模式匹配必须覆盖所有可能的分支,因此报错。
修正后的代码
直接用List.filter配合简单的判断逻辑,同时处理Result类型的包裹:
let pairToBeFiltered = Ok ([(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])]) // 用Result.map处理Ok包裹的列表,内部用List.filter过滤 let filtering = Result.map (List.filter (fun (_, y) -> y <> [])) pairToBeFiltered
分步解释
(fun (_, y) -> y <> []):匿名函数接收元组,忽略第一个元素,判断第二个元素是否非空,返回布尔值给List.filter。Result.map:自动提取Ok中的列表,执行过滤后再重新包裹成Ok;如果是Error分支则直接保留原错误。
手动处理Result分支的写法(更直观)
如果不想用Result.map,也可以显式匹配Result类型:
let filtering = match pairToBeFiltered with | Ok tupleList -> Ok (List.filter (fun (_, y) -> y <> []) tupleList) | Error err -> Error err // 保留错误场景的处理
运行后就能得到预期输出:
Ok([(2, [3; 4]); (5, [6; 7; 8])])
内容的提问来源于stack exchange,提问作者adnan
相关产品推荐
相关产品推荐

