函数式编程四大定律.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
函数式编程四大定律

函数式编程第一定律: 函数是第一型 这句话本身该如何理解?什么才是真正的“第一型”?我们看下面的数学概念: 二元方程式 F(x, y) = 0,x, y 是变量, 把它写成 y = f(x), x是参数,y是返回值,f是由x到y的映射关系,被称为函数。如果又有,G(x, y, z) = 0,或者记为 z = g(x, y),g是x、y到z 的映射关系,也是函数。如果g的参数x, y又满足前面的关系y = f(x), 那么得到z = g(x, y) = g(x, f(x)),这里有两重含义,一是f(x)是x 上的函数,又是函数g的参数,二是g是一个比f更高阶的函数。 这样我们就用z = g(x, f(x)) 来表示方程F(x, y) = 0和G(x, y, z) = 0的关联解,它是一个迭代的函数。我们也可以用另一种形式来表示g,记z = g(x, y, f),这样我们将函数g一般化为一个高阶函数。同前面相比,后面这种表示方式的好处是,它是一种更加泛化的模型,例如T(x,y) = 0 和G(x,y,z) = 0 的关联解,我们也可以用同样的形式来表示(只要令f=t)。在这种支持把问题的解转换成高阶函数迭代的语言体系中,函数就被称为“第一型”。 JavaScript中的函数显然是“第一型”。下面就是一个典型的例子: Array.prototype.each = function(closure) { return this.length ? [closure(this.slice(0, 1))]. concat(this.slice(1).each(closure)) : []; } 这真是段神奇的魔法代码,它充分发挥了函数式的魅力,在整个代码中只有函数(function)和符号(Symbol)。它形式简洁并且威力无穷。 [1,2,3,4].each(function(x){return x * 2})得到[2,4,6,8],而[1,2,3,4].each(function(x){return x-1})得到[0,1,2,3]。 函数式和面向对象的本质都是“道法自然”。如果说,面向对象是一种真实世界的模拟的话,那么函数式就是数学世界的模拟,从某种意义上说,它的抽象程度比面向对象更高,因为数学系统本来就具有自然界所无法比拟的抽象性。 闭包,在前面的章节中我们已经解释过了,它对于函数式编程非常重要。它最大的特点是不需要通过传递变量(符号)的方式就可以从内层直接访问外层的环境,这为多重嵌套下的函数式程序带来了极大的便利性,例如下面这段代码: JavaScript:(function outerFun(x) {return function innerFun(y){return x * y}}) (2)(3);//innerFun访问外层的x 什么是Currying? 它是一个有趣的概念。还是从数学开始:我们说,考虑一个三维空间方程 F(x, y, z)= 0,如果我们限定z = 0,于是得到 F(x, y, 0) = 0 记为 F’(x, y)。这里F’显然是一个新的方程式,它代表三维空间曲线F(x, y, z)在z = 0 平面上的两维投影。记y = f(x, z), 令z = 0, 得到 y = f(x, 0),记为 y= f’(x),我们说函数f’是f的一个Currying解。 下面给出了JavaScript的Currying的例子: 例22.7 Currying(科里化) html head titleExample-22.7 Currying/title /head body script !— //这是一个计算x+y的函数,但是它和常规函数的不同之处在于 //它是被Currying的 function add(x, y) { //当x,y都有值得时候,计算并返回x+y的值 if(x!=null y!=null) return x + y; //否则,若x 有值y没有值 else if(x!=null y==null) return function(y) { //返回一个等待y参数进行后续计算的闭包 return x + y; } //若x 没有值y有值 else if(x==null y!=null) return function(x) { //返回一个等待x参数进行后续计算的闭包 return x + y; } } //计算add(3,4)的值,得到3+4的结果7 var a = add(3, 4); //计算add(2)的值,得到一个相当于求2+y的函数 var b = add(2); //继续传入y的值10,得到2+10的结果12 var c = b(10); -- /script /body /htm

文档评论(0)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档