C#的函数柯里化
前面说到了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#的函数柯里化的更多相关文章
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- [转]js函数式变成之函数柯里化
本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...
- 函数柯里化(Currying)示例
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- JavaScript函数柯里化的一些思考
1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...
- 一道javascript面试题(闭包与函数柯里化)
要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...
- 深入理解javascript函数进阶系列第二篇——函数柯里化
前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
- Swift函数柯里化(Currying)简谈
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多 ...
随机推荐
- 一个无缝滚动的jquery插件
$.fn.imgscroll = function(o){ var defaults = { speed: 40, amount: 0, width: 1, dir: "left" ...
- IIS 的一些配置记录
1.日志分析: URL:http://www.cnblogs.com/fish-li/p/3139366.html2.性能监视: 执行 perfmon.msc ,右键添加counter,添加web s ...
- 5. Singleton(单例)
意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...
- js打开新页面
var PostNewPage=function (url, params) { var temp_form = document.createElement("form"); t ...
- Bootstrap组件
1.Bootstrap组件——Glyphicons图标字体 图标字体:可以表示的文字不是abcd或1234,而是一个又一个图形符号,比直接使用图片好处:可以任意放大不会失真:所有能使用文字的地方都可以 ...
- Spring 常用的一些工具类
学习Java的人,或者开发很多项目,都需要使用到Spring 这个框架,这个框架对于java程序员来说.学好spring 就不怕找不到工作.我们时常会写一些工具类,但是有些时候 我们不清楚,我们些的工 ...
- Ubuntu16.04下面配置java环境变量
我在ubuntu 16.04下面配置java环境变量的时候,开始在网上查信息的时候,没太注意ubuntu的版本,结果在.bashrc下面设置,在.profile下面设置,都不成功, 后面才想起来搜索u ...
- eclipse开发环境搭建
1.eclipse插件OpenExplorer快速打开文件目录 下载地址:https://github.com/samsonw/OpenExplorer/downloads 下载jar包,将jar包放 ...
- ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- ibatis 使用 in 查询的几种XML写法
原文地址:http://blog.csdn.net/dracotianlong/article/details/35303593 这里摘抄学习 1.传入参数是数组 <select id=&quo ...