将模式匹配函数转换为match表达式时遇类型不匹配问题求助
F# 反转列表函数的类型不匹配问题解决
问题根源
你错误地将function语法糖的匹配对象替换成了累加器acc,而实际上function是fun x -> match x with的语法糖,它匹配的是函数的输入参数(即待处理的列表),而非累加器。
原代码中rev acc = function ...等价于:
let rec rev acc = fun lst -> match lst with ...
这里rev是柯里化函数,第一个参数是累加器acc,返回的是一个接受待处理列表lst的函数。
而你修改后的代码中,match acc with错误地将累加器作为匹配对象,导致rev仅接受一个参数acc,但调用时传入了[]和ls两个参数,直接触发类型不匹配;同时逻辑上也会直接返回初始累加器[],完全不符合反转需求。
修正后的代码
有两种等价的修正方式:
方式1:显式写出待处理列表参数
保留柯里化结构,用fun显式定义待处理列表参数,再对其进行匹配:
let reverse ls = let rec rev acc = fun lst -> match lst with | h :: t -> rev (h :: acc) t | [] -> acc rev [] ls
方式2:将rev定义为双参数函数
直接把累加器和待处理列表作为rev的两个参数,匹配第二个参数:
let reverse ls = let rec rev acc lst = match lst with | h :: t -> rev (h :: acc) t | [] -> acc rev [] ls
验证结果
调用reverse [1;2;3]会正确返回[3;2;1],符合预期。
内容的提问来源于stack exchange,提问作者LearnerX
相关产品推荐
相关产品推荐

