您现在的位置: 爱51代码网 >> 范文 >> 文章正文
C#函数式Currying函数

C#函数式Currying函数

在函数式编程语言中,Currying函数是一个惯用的形式。

但是对于C#程序员来说,这比较陌生。

为了解释这个问题,我们看一个小例子:

 Func<int, Func<int, int>> add = x => new Func<int, int>(y => x + y); int i = add(3)(4); Console.WriteLine(i);


我们定义了一个函数,add,它接受一个参数,并且返回一个新的方法,接受第二个参数,并且求出最终的结果。

因此,实际上add函数本身并非一次求出最终的结果,而是分为了两步。

我们可以通过给add传递参数得到一个新的函数,然后用新的函数去求值:

 Func<int, int> addTen = x => add(10)(x); int j = addTen(i); Console.WriteLine(j);


下面,我们用到这些预备知识实现一个复杂的,做一个通用的二元运算:
我们管这个二元运算叫做eval函数,并且带入刚才的add,实现加法运算:

Func<int, Func<Func<int, Func<int, int>>, Func<int, int>>> eval =     x => new Func<Func<int, Func<int, int>>, Func<int, int>>(         y => new Func<int, int>(z => y(x)(z))); Func<int, Func<int, int>> add = x => new Func<int, int>(y => x + y); int i = eval(3)(add)(5); Console.WriteLine(i);

现在我们要实现减法运算,我们说了,eval是通用的二元运算,我们只要传入一个sub函数即可:

Func<int, Func<int, int>> sub = x => new Func<int, int>(y => x - y); i = eval(i)(sub)(1);


好吧,我说的比较抽象。理论说完了,下面是实践的部分。

这个代码展示了一个遍历集合的场景:

C# code?12345 Func<Action<int>, Action<int[]>> iter = new Func<Action<int>,Action<int[]>>     (x => new Action<int[]>(y => { foreach (int i in y) x(i); })); var OutputArray = iter(x => Console.WriteLine(x)); int[] data = { 1, 2, 3, 4, 5 }; OutputArray(data);

代码分为三个层次,一个是定义了一个叫iter的系统库函数,它最抽象,既没有规定遍历什么集合,也不知道遍历的过程做什么操作。
第二个是OutputArray的用户函数,这个函数规定了它的用途,用来输出元素,但是将数组作为参数。
第三个是调用OutputArray产生结果,此刻代码有了最终的用途。

      Func<int, Func<int, int>> add = x => (y => x + y);             int n = 0;             var i = add(add(n++)(n++))(add(n++)(n++));  //6             n = 0;             var j = add(add(++n)(++n))(add(++n)(++n));  //10

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    随机找出24个不一样的字,在把一
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    lotus代理中LS如何将字符串保存到
    在lotus BS系统里怎样方便实现统
    不小心卸载了.net 4 extend,vs2
    C#的session取不到值
    java如何判断一个字符串里的数字
    java怎么实现html转为pdf
    undefined reference timer_crea
    linux文件/usr/lib破坏了,还原后
    Failed to open eth0
    android手机无法与eclipse或电脑
    C/C++洗牌算法源代码
    ZOJ 3700 Ever Dream 文章中单词
    asp.net access 登陆界面,用
    为什么用discuz!NT做的论坛
    不小心卸载了.net 4 extend,
    C#byte【】里的数转换成stri
    C#的session取不到值
    C# GridView绑定数据库中数据
    Session Cookie without Sec
    webform中文本框textbox自动
    WPF控件的访问限制没有了
    ""!=transStatus与transStat
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |