#F# 中类型名称之前的a 意味着什么?
例如这里:
let getTestData (inner : int [] -> #seq<int>) (outer : #seq<int> [] -> #seq<'U>) =
(testData |> Array.map inner) |> outer
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 13
该语法#type称为“灵活类型”,它是表示该类型可以是实现给定接口的任何类型的快捷方式。当函数的用户可能想要指定具体类型(如数组或列表)时,这非常有用。
举一个非常简单的例子,让我们看一下:
let printAll (f: unit -> seq<int>) =
for v in f () do printfn "%d" v
Run Code Online (Sandbox Code Playgroud)
调用者必须printAll使用返回序列的 lambda 进行调用:
printAll (fun () -> [1; 2; 3]) // Type error
printAll (fun () -> [1; 2; 3] :> seq<int>) // Works, but tedious to write!
Run Code Online (Sandbox Code Playgroud)
如果使用灵活类型,则函数的返回类型可以是以下任意实现seq<int>:
let printAll (f: unit -> #seq<int>) =
for v in f () do printfn "%d" v
printAll (fun () -> [1; 2; 3]) // No problem!
Run Code Online (Sandbox Code Playgroud)
实际上,语法#typ只是表示 的快捷方式'T when 'T :> typ,因此您可以将我的示例中的函数重写为:
let printAll<'T when 'T :> seq<int>> (f: unit -> 'T) =
for v in f () do printfn "%d" v
Run Code Online (Sandbox Code Playgroud)