【问题标题】:What is the purpose of flexible type annotation in F#?F# 中灵活类型注释的目的是什么?
【发布时间】:2013-01-05 15:00:20
【问题描述】:

我在学习F#,不明白灵活类型的目的,或者更好,我不明白写这个的区别:

set TextOfControl (c : Control) s = c.Text <- s

并写下:

set TextOfControl (c : 'T when 'T :> Control) s = c.Text <- s

其中ControlSystem.Windows.Forms.Control 类。

【问题讨论】:

    标签: .net f# functional-programming f#-3.0


    【解决方案1】:

    您的示例没有区别。如果返回类型受到限制,您就会开始看到差异:

    let setText (c: Control) s = c.Text <- s; c
    let setTextGeneric (c: #Control) s = c.Text <- s; c
    
    let c = setText (TreeView()) "" // return a Control object
    let tv = setTextGeneric (TreeView()) "" // return a TreeView object
    

    注意#Control'T when 'T :&gt; Control 的快捷方式。 Type constraints 对于为子类型创建通用函数很重要。

    例如,

    let create (f: _ -> Control) = f()
    
    let c = create (fun () -> Control()) // works
    let tv = create (fun () -> TreeView()) // fails
    

    对比

    let create (f: _ -> #Control) = f()
    
    let c = create (fun () -> Control()) // works
    let tv = create (fun () -> TreeView()) // works
    

    【讨论】:

      【解决方案2】:

      当直接将值作为参数传递给 F# 函数时,编译器会自动向上转换该值(因此,如果函数采用 Control,您可以为其指定 TextBox 值)。所以,如果你使用灵活类型作为参数的类型,并没有太大的区别。

      但是,如果函数采用,例如列表'T list

      // Takes a list of any subtype of object (using flexible type)
      let test1<'T when 'T :> obj> (items:'T list) =
        items |> List.iter (printfn "%A")
      
      // Takse a list, which has to be _exactly_ a list of objects
      let test2 (items:obj list) =
        items |> List.iter (printfn "%A")
      
      // Create a list of System.Random values (System.Random list)
      let l = [new System.Random()]
      test1 l // This works because System.Random is subtype of obj
      test2 l // This does not work, because the argument has wrong type!
      

      【讨论】:

      • 为什么list 不是协变的?
      猜你喜欢
      • 1970-01-01
      • 2017-10-02
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2020-11-05
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多