找到点干货:
PROFESSIONAL FUNCTIONAL PROGRAMMING IN C#
看了下目录,正是我想要的,同时也发现,函数式编程果然博大精深,看目录,就有第一次看编程语言或是面向对象的感觉,里面的章节,基本上没有一个概念是熟悉的.
先从中文目录起把概念列出来:
惰性列表:迭代器
闭包
表达式树
局部套用
部分应用
惰性求值
缓存技术
递归调用
高阶函数
序列
组合函数
可选值
防止数据变化
单子
实际应用
MapReduce 模式
看了下目录,很多名词都无法直观表述,容易误解,我看还是看原版吧,顺便把E语学了.以防再重走以前学面向对象的老路(初学时搞不清楚对象是什么东西.后来知道是object,物体,东西,反而更容易理解了).
先来Currying:
Func < int, int, int > add = (x, y) => x + y;
作者也是用加减乘除举例子,这就很有趣了.原来问题是一致的.正等解决方案呢.
var add = (x, y) => x + y;不行,果然是C#还不支持,作者也在吐
Func < int, Func < int, int > > curriedAdd = x => y => x + y;
int i = curriedAdd(5)(6);
啊,原来Curring这么简单.和int result = addition(1, multiplication(2, subtraction(3, 1)))不一样了.
先不管Curring后到底能干什么,起码我们有了.但作者吐的东西就是,参数多了,定义复杂,所以绕了个圈子.
Automatic Currying
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
return par1 => par2 => func(par1, par2);
}
然后就可以:
var v = Curry((int x, int y) => x + y);
var v1 = Curry<int, int, int>((x, y) => x + y);
int a = 1;
int j = v(a)(a);
var v3 = v1(a);
int k = v3(1);
a = 100;
int l = v3(1);
果然神奇的事情发生了, l值不受a变量改变的影响,函数式编程里的无副作用果然实现.
而传统两参数add(1, a)时,a变了,再调用add(1,a),那肯定是变化后的值了.真是神奇.