【问题标题】:What does a # before a type name mean in F#?在 F# 中,类型名称前的 # 是什么意思?
【发布时间】: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#


    【解决方案1】:

    语法#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&lt;int&gt;的任意实现:

    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 :&gt; typ 的一种快捷方式,因此您可以将我示例中的函数重写为:

    let printAll<'T when 'T :> seq<int>> (f: unit -> 'T) = 
      for v in f () do printfn "%d" v
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多