项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.什么是柯里化函数

在scala相关的教程与参考文档里,经常会看到柯里化函数这个词。但是对于具体什么是柯里化函数,柯里化函数又有什么作用,其实可能很多同学都会有些疑惑。今天就跟大家来掰扯掰扯柯里化函数(Haskell Curry)。

首先看两个简单的函数:

    def add(x: Int, y: Int) = x + ydef addCurry(x: Int)(y: Int) = x + y

以上两个函数实现的都是两个整数相加的功能。对于add方法,调用方式为add(1,2)。对于addCurry方法,调用的方式为addCurry(1)(2)。这种方式就叫做柯里化。说得更加简单粗暴一点,有多个参数列表,或者说多个小括号括起来的函数参数列表的函数就是柯里化函数。

2.为什么要使用柯里化

看了前面的例子,很多人估计忍不住就要开喷了:你特么逗我呢?好好的给一个方法传两个参数不挺好么,干嘛搞这么复杂。
我能理解大家的感受,我第一次看到这种做法心里也是有一万匹草泥马奔腾而过。不过我们要相信一句话,存在即合理,既然这么干,肯定是有合理的地方,暂且慢慢分析。

curry化最大的意义在于把多个参数的函数等价转化成多个单参数函数的级联,这样所有的函数就都统一了,方便做lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化以后,放在两个参数列表里,后面一个参数列表里的参数可以借助前面一个参数列表里的参数类型进行推演。

上面的说法比较书面化,用更加口语化的一点来描述:
1.把多个参数转化为单参数函数的级联,达到了动态确定参数的目的。
2.当某些参数不确定时,可以先保留一个存根。剩余的参数确定以后,就可以通过存根调用剩下的参数。
3.通过类似于建造者模式(building),把一个大的东西的构造过程,切成一个个的小模块来逐步构造。举个最简单的例子,Person.name("xxx").age(num).salary(count).phone(xxxx)

3.scala源码中的柯里化

scala源码中存在大量的柯里化函数的应用,看几个简单的例子。

  def foldLeft[B](z: B)(f: (B, A) => B): B = {var acc = zvar these = thiswhile (!these.isEmpty) {acc = f(acc, these.head)these = these.tail}acc}

从foldLeft的方法原型里很容易就看出来,这是就是典型的柯里化函数的应用。foldLeft有两个参数,一个为参入的初始值z,类型为B。另一个为函数f,f有两个参数,一个类型与传入的初始值相同,另一个为集合本身的类型A,最后方法返回的类型为B。

    def foldtest() = {val list = List(1, 2, 3)val strResleft = list.foldLeft("res:")((x: String, y:Int) => x + y)val strResRight = list.foldRight("res:")((y: Int, x: String) => x + y)println(strResleft)println(strResRight)}

函数的输出:

res:123
res:321

scala中的柯里化函数相关推荐

  1. Scala中的柯里化

    首先要区分Scala函数与方法的区别,这在Scala中是两个不同概念,只有理解了这两个概念才能理解柯里化. 方法 scala> def add(x:Int, y: Int) = x + y ad ...

  2. 函数式编程 -- 纯函数、柯里化函数

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 学习函数式编程,要知道什么是纯函数,使用纯函数的好处,了解有关副作用的相关信息,以及纯函数相关的功能库Lodash,还有什么是函数的柯里化. 一.纯 ...

  3. 【译】理解JavaScript中的柯里化

    译文开始 函数式编程是一种编程风格,这种编程风格就是试图将传递函数作为参数(即将作为回调函数)和返回一个函数,但没有函数副作用(函数副作用即会改变程序的状态). 有很多语言采用这种编程风格,其中包括J ...

  4. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...

    高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...

  5. js学习总结----柯里化函数

    柯里化函数函数思想:一个JS预处理的思想->利用函数执行可以形成一个不销毁的私有作用域的原理,把需要预先处理的内容都存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函 ...

  6. JS高级——纯函数、柯里化(手写自动柯里化函数)、组合函数(手写自动组合函数)

    一.理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念: 在react开发中纯函数是被多次提及的: 比如react ...

  7. JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]

    JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...

  8. 【react】---函数化编程的理解,柯里化函数及返柯里化函数的理解...

    虚拟DOM  与 js概念的理解 01.纯函数的理解: 02.柯里化函数 编写一个函数add(3)(4)(5)  得出结果  12    //通过柯里化  函数就可以实现 一个函数内,执行过程中,返回 ...

  9. 认识柯里化函数及其应用

    认识柯里化函数及其应用 维基百科中的定义 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数 ...

  10. JavaScript学习笔记(四)---闭包、递归、柯里化函数、继承、深浅拷贝、设计模式

    JavaScript学习笔记(四)---闭包.递归.柯里化函数.继承.深浅拷贝.设计模式 1. 匿名函数的使用场景 2.自运行 3.闭包 3.1前提: 3.2闭包 4.函数对象的三种定义方式 5.th ...

最新文章

  1. python list越界原因(list assignment index out of range)
  2. 升级EXCHANGE2010到2013(A)
  3. 学python需要多久-怎么自学python,大概要多久?
  4. cmake (3)多个源文件aux_source_directory
  5. 彻底搞懂---三握四挥
  6. 面向.Net程序员的前端优化
  7. 精美日历EXCLE格式
  8. 在 ASP.NET Core 中使用多种方式给 Action 传参
  9. 【selenium 小练手 抓取某大厂TP】
  10. Rancher助力美国农业部的容器实践之路
  11. win7下搭建opengl es 2.0开发环境
  12. 从“朕已阅”到“翻牌子”,程序员的仪式感可以有多重?
  13. php inqude函数,Python匿名函数(lambda函数)
  14. ImageLoader
  15. 前端安全: 如何防止 XSS 攻击?
  16. oracle元转换为亿元,元换算成亿元(亿元和圆的换算)
  17. Linux下分卷压缩与解压
  18. 《卓有成效的管理者(The Effective Executive)》读后感
  19. 您有新的订单提示音在线试听_告别千篇一律的微信提示音
  20. EasyRecovery免费电脑硬盘数据恢复软件使用教程

热门文章

  1. 关于js执行机制的理解
  2. 使用数据库引擎优化顾问添加建议索引
  3. Git基础之(十五)——分支管理——分支管理策略
  4. JS动态呈现还可以输入字数
  5. Android学习---解决Android Graphical Layout 界面效果不显示
  6. sql row_number() over() 来自动产生行号
  7. web controls归档
  8. XNA Game Studio 2.0安装问题,崩溃了
  9. 你的网站上显示Alexa世界排名的代码(表)
  10. Push failed: Failed with error: Authentication failed for