簡體   English   中英

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# 中實現一個簡單的快速排序 function。 該語言相對較新,但從我所閱讀的內容和我對語法的理解來看,這應該呈現一個 integer 列表,而是呈現模棱兩可的“單元列表”。

為什么這會給出一個單位列表而不是一個 int 列表?

它在“%A”處出錯,說明類型不匹配。

正如 OP 中給出的那樣, quick是一個 function ,它采用兩個參數: castmmm function 的類型是int list -> int list -> int list

然而,function 調用quick [3;5;6;7;8;7;5;4;3;4;5;6]只提供一個參數。 由於 F# 函數被柯里化,返回值是一個新的 function:

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

This function (in my F# Interactive window called it@3-4 ) has the type int list -> int list - that is: It's a function that 'still waits' for an int list argument before it runs.

當您使用%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 = ()

您可能只希望 function 采用單個列表參數。 此外,您ignore的步驟無效,因此您可以考慮另一種遞歸調用quick的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM