F# 中类型名称前的 # 是什么意思?

sdg*_*sdh 9 f#

#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)