F# int 列表与单元列表

F# int list versus unit list

open System

let rec quick (cast: int list) mmm =
    match mmm with
    | [] -> []
    | first::rest ->
    
        let small = (rest |> List.filter (fun x -> x < first)) 
        let large = (rest |> List.filter (fun x -> x >= first))

        quick small |> ignore
        quick large |> ignore
    
        //[small @ [first] @ large]
        List.concat [small; [first]; large]

[<EntryPoint>]
let main argv =
    printfn "%A" (quick [3;5;6;7;8;7;5;4;3;4;5;6]);;

0

尝试在 F# 中实现一个简单的快速排序函数。 这门语言相对较新,但从我读过的内容和我对语法的理解来看,这应该显示一个整数列表,但显示的是模棱两可的“单元列表”。

为什么这里给出的是单位列表而不是整数列表?

它在“%A”处出错,指出类型不匹配。

如 OP 中所述,quick 是一个带有两个参数的函数:castmmm。函数的类型是int list -> int list -> int list.

然而,函数调用quick [3;5;6;7;8;7;5;4;3;4;5;6]只提供一个参数。由于 F# 函数是柯里化的,因此 return 值是一个新函数:

> quick [3;5;6;7;8;7;5;4;3;4;5;6];;
val it : (int list -> int list) = <fun:it@3-4>

此函数(在我的 F# Interactive window 中称为 it@3-4)具有类型 int list -> int list - 即:它是一个函数'still waits' 对于 int list 参数在运行之前。

当您使用 %A 格式说明符打印它时,它会将 <fun:it@4-5> 打印到控制台。 printfn 的 return 值为 () (unit):

> printfn "%A" (quick [3;5;6;7;8;7;5;4;3;4;5;6]);;
<fun:it@4-5>
val it : unit = ()

您可能只希望函数采用单个列表参数。此外,您 ignore 的步骤没有任何效果,因此您可以考虑另一种递归调用 quick.

的方法