F#入门-第四章 面向对象-第十节 委托

委托
   
委托具有“过渡转移”的含义,例如,使用C#的委托,可以实现象C语言中的函数指针那样将函数过渡转移到别的函数去进行处理的功能。

    在F#中,通过使用delegate,可以“将函数作为值进行利用”。当然,因为在F#中本来就可以将函数作为值进行利用,所以F#的委托,应用在以下场合。
1.不能与C#等其他.NET相互利用的时候。
2.为了在F#中直接调用C语言的代码而定义回调函数(callback)的时候。

    通过delegate关键字来使用委托。

使用委托
type dele = delegate of int -> int;;
let a = new dele(fun i -> i+1);;
print_any <| a.Invoke(3);;


    在第一行中声明了dele类型名的委托,该委托接受int->int这种类型的函数作为参数。第二行中,将dele过渡给加1函数,第3行中,通过dele来调用函数,该函数中把3作为参数。使用Invoke方法来调用象这样经过委托后的函数。

    F#的函数多数是被利用在回调函数中。这是因为需要用委托来定义事件句柄(eventhandler)。但是,使用已经用委托定义好的事件句柄时,不需要知道它是通过委托进行定义的。因为将函数进行委托时,只要有类型,F#就可以自动实现委托了。(参考:Foundations of F# p72)

委托合成(通过函数合成)

    在C#中,因为可以重载+或-运算符,所以可以实现委托合成。但是在F#中上述功能是不能实现的。但是因为在F#中,函数的合成是非常容易实现的,所以将函数合成后再进行委托也可以实现委托合成。而且,在C#中通过合成后的委托的调用顺序是不确定的,但是因为可以控制要进行函数合成的函数在被调用时的先后顺序,所以可以控制合成后的委托的调用顺序。

利用函数合成进行的委托合成
//>>为函数合成。计算2*x + 1的函数
let twice_add1 = (( * ) 2) >> ((+)1);;

type dele = delegate of int -> int;;
let a = new dele(twice_add1);;
//不能编译。因为不能确定到底相当于C#语言中的2x+1还是2*(x+1)
//let b = new dele((+)1) + new dele(( * ) 2);;
print_any <| a.Invoke(3);;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值