现在的位置: 首页 > 综合 > 正文

函数式编程的浅议

2012年03月11日 ⁄ 综合 ⁄ 共 904字 ⁄ 字号 评论关闭

先来看看一段来自于IBM的说法

函数式编程只描述在程序输入上执行的操作,不必使用临时变量保存中间结果。重点是捕捉 “是什么以及为什么”,而不是 “如何做”。与将重点放在执行连续命令上的过程性编程相比,函数式编程的重点是函数的定义而不是状态机(state machine)的实现。大型知识管理系统应用程序从使用函数式编程风格上受益颇多,因为函数式编程简化了开发。

下面从C#的lambda入手看看如何理解比较简单
而第二个函数就是Y组合子的定义模式:

let Y = lambda y . (lambda x . y (x x)) (lambda x . y (x x))
Y=(\f(\x.f(x x))(\x.f(x x)))

static Func<T,TResult>Y<T,TResult>(Func<T,TResult> F)
{
    
return F;
}

static Func<T,TResult> Y2<T, TResult>(Func<Func<T, TResult>, Func<T,TResult>> F)
{
    
return (x)=>F(Y2(F))(x);
}

第一个函数的参数是一个以Func<T,TResult>为类型的函数,由于F的最终值为TResult类型所以符合要求。
第二个函数的参数是一个以Func<Func<T, TResult>, Func<T,TResult>> 为类型的函数F,它是如何实现函数调用的呢?
1.Func<Func<T, TResult>, Func<T,TResult>> 中的第一个参数Func<T, TResult>,定义的是一个参数的输入类型这和Y2的类型相匹配,而且由于第二个Func<T, TResult>参数定义的是她的返回类型与Y2的返回类型相匹配所以参数定义正确
2.返回值中(x)=>F(Y2(F))(x);由外到里可以看到F和Y2都是以<T, TResult>为参数模式来定义的所以多重调用并不会影响其实际的结果。即x;
3.调用上来说 Console.WriteLine(Y2<int, int>(add=>x=>x+3)(3));中实际上就是Y2函数的两次调用。从=>和Y2参数的Func匹配次数就可见一般。

抱歉!评论已关闭.