【发布时间】:2021-10-18 19:02:05
【问题描述】:
在 F# 中,类型名称前的 # 是什么意思?
例如here:
let getTestData (inner : int [] -> #seq<int>) (outer : #seq<int> [] -> #seq<'U>) =
(testData |> Array.map inner) |> outer
【问题讨论】:
标签: f#
在 F# 中,类型名称前的 # 是什么意思?
例如here:
let getTestData (inner : int [] -> #seq<int>) (outer : #seq<int> [] -> #seq<'U>) =
(testData |> Array.map inner) |> outer
【问题讨论】:
标签: f#
语法#type 被称为“灵活类型”,它是表示该类型可以是实现给定接口的任何类型的快捷方式。这在函数的用户可能想要指定具体类型(如数组或列表)的情况下很有用。
举一个非常简单的例子,我们来看这个:
let printAll (f: unit -> seq<int>) =
for v in f () do printfn "%d" v
调用者必须使用返回序列的 lambda 调用 printAll:
printAll (fun () -> [1; 2; 3]) // Type error
printAll (fun () -> [1; 2; 3] :> seq<int>) // Works, but tedious to write!
如果使用灵活类型,函数的返回类型可以是seq<int>的任意实现:
let printAll (f: unit -> #seq<int>) =
for v in f () do printfn "%d" v
printAll (fun () -> [1; 2; 3]) // No problem!
实际上,#typ 语法只是表示'T when 'T :> typ 的一种快捷方式,因此您可以将我示例中的函数重写为:
let printAll<'T when 'T :> seq<int>> (f: unit -> 'T) =
for v in f () do printfn "%d" v
【讨论】: