函数式编程的浅议
先来看看一段来自于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)))
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
第二个函数的参数是一个以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匹配次数就可见一般。