函数式编程学习之路(六)

找到点干货:

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),那肯定是变化后的值了.真是神奇.

 

 

 

posted @ 2013-04-19 22:44  人工智能-群513704292  阅读(412)  评论(2编辑  收藏  举报