F# int 列表与单位列表

Ste*_*eve 4 sorting f# types functional-programming visual-studio-2019

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
Run Code Online (Sandbox Code Playgroud)

尝试在 F# 中实现一个简单的快速排序功能。对于该语言来说相对较新,但从我所读到的内容以及我对语法的理解来看,这应该呈现一个整数列表,但呈现的是含糊不清的“单位列表”。

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

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

Mar*_*ann 5

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

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

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

该函数(在我的F# 交互窗口中称为it@3-4)具有以下类型int list -> int list- 即: 它是一个int list在运行之前“仍然等待”参数的函数。

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

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

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