首先要区分Scala函数与方法的区别,这在Scala中是两个不同概念,只有理解了这两个概念才能理解柯里化。

方法

scala> def add(x:Int, y: Int) = x + y

add: (x: Int, y: Int)Int

scala> add(1, 2)

res0: Int = 3

函数

scala> val add_f = (x: Int, y: Int) => x + y

add_f: (Int, Int) => Int = <function2>

根据内容可以看出add_f是一个函数Function

scala> add_f(1, 2)

res1: Int = 3

方法与函数区别

scala> val add_f = (x: Int, y: Int) => x + y

add_f: (Int, Int) => Int = <function2>

scala> def add_f = (x: Int, y: Int) => x + y

add_f: (Int, Int) => Int

首先应该要知道=号右边的内容 (x: Int, y: Int) => x + y是一个函数体

方法只能用def接收,函数可以用def接收,也可以用val接收。

当函数用def来接收之后,不再显示为function,转换为方法

方法可以省略参数,函数不可以。函数可以作为方法的参数。

//这两个都是方法

scala> def a = 100

a: Int

scala> def a() = 100

a: ()Int

scala> val a = () => 100

a: () => Int = <function0>

scala> val a = => 100

<console>:1: error: illegal start of simple expression

val a = => 100

// 当函数参数为空时报错

闭包

scala> def addBase(x:Int) = (y:Int) => x + y

addBase: (x: Int)Int => Int

(y:Int) => x + y是一个函数体

addBase可以理解为返回值为函数的方法

当给方法具体参数时,返回一个具体的函数,方法参数不同时,返回的函数也不同。例如

scala> val addOne = addBase(1)

addOne: Int => Int = <function1>

scala> addOne(3)

res2: Int = 4

scala> val addTwo = addBase(2)

addTwo: Int => Int = <function1>

scala> addTwo(3)

res3: Int = 5

这时就可以引入闭包的概念了。

在块中可以参照外部局部变量的方法,并说明块不只是简单的代码,而且把外部“环境”也包括了进来,像这样的块称为闭包。通常的局部变量在方法执行结束时就不存在了,但是如果被包括进了闭包,那么在闭包存在的期间,局部变量也会一直存在。

也就是说,函数体受外部环境所影响,一段封闭的代码块将外部环境包括进来,就是闭包。

柯里化

柯里化指的是将原来接受两个参数的方法变成新的接受一个参数的函数的过程。

其实上面闭包的代码就是柯里化的过程。以下是柯里化第二种写法。

scala> def add(x:Int)(y:Int) = x + y

add: (x: Int)(y: Int)Int

scala> add(2)(3)

res5: Int = 5

scala> val addOne = add(1) _

addOne: Int => Int = <function1>

scala> addOne(3)

res6: Int = 4

scala> val addTwo = add(2) _

addTwo: Int => Int = <function1>

scala> addTwo(3)

res7: Int = 5

Scala中的柯里化相关推荐

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

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

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

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

  3. JavaScript 中函数 柯里化风格的运用

    导语 当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 "高大上"的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后 ...

  4. Scala系列-4、scala中特质、柯里化、闭包等

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala中特质 特质作为接口使用 特质中放置非抽象的成员 ...

  5. 7.scala初识 柯里化、隐式参数、隐式转换、视图边界、上界、下界、协变、逆变

    1.前言: 学过java我们都知道,java中的继承是对类的增强,java中的代理.装饰是对对象方法的增强.而在scala中,隐式转换和隐式参数是Scala中两个非常强大的功能,隐式的对类的方法进行增 ...

  6. scala akka 修炼之路6(scala函数式柯里化风格应用场景分析)

    胜败兵家事不期,包羞忍耻是男儿--斗牛士fighting,fighting,fighting... 小象学习和使用scala也一段时间了,最初小象学习scala主要为了学习spark生态,但是深入学习 ...

  7. javascript --- 函数的柯里化 Vue 2.x中柯里化的使用

    函数式编程部分重点 参考资料: 函数式编程 柯里化 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数 var add = function (x) {return function(y ...

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

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

  9. java8柯里化_借助Java 8实现柯里化

    在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术.这 ...

最新文章

  1. 通用makefile
  2. C#WebBrowser控件使用教程与技巧收集
  3. IP域名DNS网站登录过程
  4. 有的时候不评价别人其实挺难的
  5. CSS选择器的权重详解
  6. java access 2013_jdk1.8环境下的java如何直连接microsoft access2013(都是64位系统也是)...
  7. 在线文本按列截取工具
  8. 2006. 差的绝对值为 K 的数对数目
  9. IBM T43 开机停止在LOGO画面
  10. PMP模拟题 | 每日一练,快速提分
  11. IDEA快捷键大全(超详细!)
  12. Python3输出所有大小写字母(字母表)、数字
  13. 悟以往之不谏,知来者之可追~
  14. 频率换算:模拟频率、模拟角频率、数字频率
  15. 机器人系统设计与制作:Python语言实现2.4 用LibreCAD生成机器人的二维CAD图
  16. 【微信早安定时推送消息】微信公众号定时推送早安消息 带天气、纪念日、生日、定时推送等(完整代码)
  17. Google Chrome浏览器出现:您目前无法访问 XX.XX.XX.XX,因为此网站发送了 Google Chrome 无法处理的杂乱凭据。
  18. ecshop源码分析——静态缓存static_c…
  19. 毕业设计——音乐播放系统 可以自己上传歌曲 SSM框架 MYSQL数据库 功能齐全
  20. ASO优化之关于应用商店的展示量

热门文章

  1. 数据库工程师考试自学(7)---函数依赖与多值依赖
  2. 个税子女教育专项附加扣除
  3. lamp架构(一台主机)
  4. oracle 建立表空间 和 用户随记
  5. 机器学习是如何利用线性代数来解决数据问题的
  6. 侧滑+viewpager 类似掌阅的滑动demo
  7. c++新特性之模板 对象
  8. fluxion技术学习
  9. 学写一个 Java Web MVC 框架(一)
  10. opencvsharp角点检测