F#实现快速排序返回unit list而非int list的原因是什么?
F#快速排序代码问题原因分析
- 多余的函数参数声明
你定义quick函数时额外声明了第一个参数cast: int list,但整个函数逻辑中从未使用过该参数,且调用quick时仅传入了1个待排序列表参数。F#默认支持柯里化,此时你得到的不是排序结果,而是一个等待接收第二个参数的偏函数,直接导致类型不匹配。 - 无效的递归调用
你对small和large的递归调用结果用ignore直接丢弃,且递归调用时也只传了1个参数,本身就是未完成调用的偏函数,最终返回的List.concat [small; [first]; large]仅完成了第一层元素的划分,完全没有实现递归排序的逻辑,也会干扰编译器的类型推断。 - 空分支返回值类型推断异常
因为前面两个问题,match分支中[] -> []的空列表返回值无法被编译器正确推断为int list,就会出现你遇到的「类型不明确的unit list」报错。
修正后的可运行代码
open System // 去掉多余的cast参数,仅保留待排序的列表参数 let rec quick (list: int list) = match list with | [] -> [] | first::rest -> let small = rest |> List.filter (fun x -> x < first) let large = rest |> List.filter (fun x -> x >= first) // 正确拼接递归排序后的结果 List.concat [quick small; [first]; quick large] [<EntryPoint>] let main argv = printfn "%A" (quick [3;5;6;7;8;7;5;4;3;4;5;6]) 0
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

