[英]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 ,它采用兩個參數: cast
和mmm
。 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.