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# 中实现一个简单的快速排序函数。
这门语言相对较新,但从我读过的内容和我对语法的理解来看,这应该显示一个整数列表,但显示的是模棱两可的“单元列表”。
为什么这里给出的是单位列表而不是整数列表?
它在“%A”处出错,指出类型不匹配。
如 OP 中所述,quick
是一个带有两个参数的函数:cast
和 mmm
。函数的类型是int list -> int list -> int list
.
然而,函数调用quick [3;5;6;7;8;7;5;4;3;4;5;6]
只提供一个参数。由于 F# 函数是柯里化的,因此 return 值是一个新函数:
> 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 window 中称为 it@3-4
)具有类型 int list -> int list
- 即:它是一个函数'still waits' 对于 int list
参数在运行之前。
当您使用 %A
格式说明符打印它时,它会将 <fun:it@4-5>
打印到控制台。 printfn
的 return 值为 ()
(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
.
的方法
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# 中实现一个简单的快速排序函数。 这门语言相对较新,但从我读过的内容和我对语法的理解来看,这应该显示一个整数列表,但显示的是模棱两可的“单元列表”。
为什么这里给出的是单位列表而不是整数列表?
它在“%A”处出错,指出类型不匹配。
如 OP 中所述,quick
是一个带有两个参数的函数:cast
和 mmm
。函数的类型是int list -> int list -> int list
.
然而,函数调用quick [3;5;6;7;8;7;5;4;3;4;5;6]
只提供一个参数。由于 F# 函数是柯里化的,因此 return 值是一个新函数:
> 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 window 中称为 it@3-4
)具有类型 int list -> int list
- 即:它是一个函数'still waits' 对于 int list
参数在运行之前。
当您使用 %A
格式说明符打印它时,它会将 <fun:it@4-5>
打印到控制台。 printfn
的 return 值为 ()
(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
.