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”處出錯,說型別不匹配。
uj5u.com熱心網友回復:
正如 OP 中給出的,quick是一個帶有兩個引數的函式:cast和mmm。函式的型別是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>
此函式(在我的F# 互動視窗中稱為it@3-4)具有型別int list -> int list- 即:它是一個int list在運行之前“仍在等待”引數的函式。
當您使用%A格式說明符列印它時,它會列印<fun:it@4-5>到控制臺。的回傳值printfnIS ()(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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/363648.html
