Fr.*_*sai 9 .net f# functional-programming f#-3.0
我正在学习F#,我不明白灵活类型的目的,或者更好,我无法理解写这个的区别:
set TextOfControl (c : Control) s = c.Text <- s
Run Code Online (Sandbox Code Playgroud)
写这个:
set TextOfControl (c : 'T when 'T :> Control) s = c.Text <- s
Run Code Online (Sandbox Code Playgroud)
这里Control是System.Windows.Forms.Control一流的.
pad*_*pad 16
你的例子没有区别.如果返回类型受到限制,您就会开始看到差异:
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
Run Code Online (Sandbox Code Playgroud)
注意这#Control是一个快捷方式'T when 'T :> Control.
类型约束对于为子类型创建通用函数很重要.
例如,
let create (f: _ -> Control) = f()
let c = create (fun () -> Control()) // works
let tv = create (fun () -> TreeView()) // fails
Run Code Online (Sandbox Code Playgroud)
与
let create (f: _ -> #Control) = f()
let c = create (fun () -> Control()) // works
let tv = create (fun () -> TreeView()) // works
Run Code Online (Sandbox Code Playgroud)
当直接将值作为参数传递给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!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |