前面说到了C#的泛型委托和闭包函数,在函数是程序设计里还有一个重要特征是柯里化...

柯里化就是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。用F#来举个例子:

> let sum x y = x + y;;

val sum : x:int -> y:int -> int

声明了一个叫sum接受三个参数并返回一个整数的函数。

> let sumwith5 y = sum 5;;

val sumwith5 : y:'a -> (int -> int)

通过这个声明,我们定义了一个接受两个参数并返回一个整数的函数。其实我们可以看到,函数的特征是y:'a -> (int -> int)而不是y:int -> int,而函数体部分为sum 5,感觉就是调用了sum这个函数,并且把x赋值为5后剩下的y由参数输入。

嗯,这个就叫做柯里化。在F#里,我们用这项技术简直游刃有余,轻轻松松就能搞一些新的函数出来,尽管这些函数是从别的函数截取的一截(更类似蹭了一节)...

那么C#能不能做这个呢...当然阔以...只不过写起来稍微嗨皮一点...就像这样:

Func<Int32, Func<Int32, Int32>> sum = x => y => x + y;
Func<Int32, Int32> sumwith5 = sum (5);

再次说一下,由于C#不是以函数式为主的程序设计语言,所以写起来自然没有F#那么自然。并且如果我们调用F#里的sum函数只需要sum 5 6就可以了,但是C#需要这样写:

sum (5) (6);

既然不自然特么还写个屌毛啊...

其实我们可以写一个方法来实现简单的柯里化,比如:

public static Func<T1, Func<T2, TR>> Curry<T1, T2, TR> (this Func<T1,T2,TR> Func) => a => b => Func (a, b);

我们实现sum函数的柯里化只需要sum.Curry ();就可以了。当然C#不是以函数式程序设计的程序设计语言...

你到底想说什么##

客官要不要来学学F#呢?

C#的函数柯里化的更多相关文章

  1. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  2. [转]js函数式变成之函数柯里化

    本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...

  3. 函数柯里化(Currying)示例

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...

  4. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  5. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  6. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

  7. 深入理解javascript函数进阶系列第二篇——函数柯里化

    前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...

  8. js高阶函数应用—函数柯里化和反柯里化

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  9. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

  10. Swift函数柯里化(Currying)简谈

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多 ...

随机推荐

  1. Xocde4与Xcode3的模板比较

    XCode 4.2.1 项目的模版截图: Single View Application This template provides a starting point for an applicat ...

  2. 【转】Win7 64bit Oracle 11g 使用PL/SQL Developer 连接时提示“SQL*Net not properly installed”

    转载:http://www.cnblogs.com/xihuaodc/p/3189257.html  因为之前的Oracle不能用了,所以重新安装了64位的Oracle,安装一路正常 完了之后安装了P ...

  3. Django模板系统——过滤器

    转自:https://www.douban.com/note/145065606/  <省得每次都得去翻麻烦> 过滤器,变量的显示形式的改变一.形式:小写{{ name | lower } ...

  4. IplImage 结构解读

    IplImage 结构解读: typedef struct _IplImage { int nSize;                              /* IplImage大小,等于wi ...

  5. [Linux] mail 命令,进入邮箱及删除邮件

    1. 命令行输入mail 2. 删除邮件 d 删除当前邮件,指针下移: d 1 删除标号为1的邮件: d 2-4 删除标号2到4的邮件: 3. 保存 q 退出mail命令平台,保存之前的操作,比如删除 ...

  6. windows7安装python2.7及scrapy

    http://www.cnblogs.com/txw1958/archive/2012/07/12/scrapy_installation_introduce.html 第0步:当然是安装python ...

  7. OpenMP并行构造的schedule子句详解 (转载)

    原文:http://blog.csdn.net/gengshenghong/article/details/7000979 schedule的语法为: schedule(kind, [chunk_si ...

  8. window常用命令

    netstat -ano|findstr "端口号"     :查看指定端口信息[netstat -ano|findstr "端口号" ] ,然后看下PID号 ...

  9. Forwards on Weibo (30)

    BFS,题意比较难懂,是求离query L层的总共人数 #include <stdio.h> #include <string.h> #include <iostream ...

  10. 如何用VB.Net创建一个三层的数据库应用程序

    [b]1.[/b][b]概论:[/b] 本文将介绍如何创建一个三层应用程序,并且将介绍如何创建一个Web Service服务. ADO.NET创建Windows三层结构应用程序的体系架构如下图所示: ...