【问题标题】:F# int list versus unit listF# int 列表与单元列表
【发布时间】:2021-12-31 20:12:06
【问题描述】:
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# 中实现一个简单的快速排序功能。 该语言相对较新,但从我所阅读的内容和我对语法的理解来看,这应该呈现一个整数列表,而是呈现一个模棱两可的“单元列表”。

为什么这给出了一个单元列表而不是一个 int 列表?

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

【问题讨论】:

    标签: sorting types functional-programming f# visual-studio-2019


    【解决方案1】:

    如 OP 中所述,quick 是一个接受两个参数的函数:castmmm。函数类型为int list -&gt; int list -&gt; int list

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

    > 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 窗口中称为 it@3-4)具有 int list -&gt; int list 类型 - 即:它是一个在运行之前“仍在等待”int list 参数的函数.

    当您使用%A 格式说明符打印它时,它会将&lt;fun:it@4-5&gt; 打印到控制台。 printfn的返回值为()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 的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多