前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10.scala的柯里化

10.scala的柯里化

作者头像
Spark学习技巧
发布2021-03-05 14:43:26
4350
发布2021-03-05 14:43:26
举报
文章被收录于专栏:Spark学习技巧Spark学习技巧

方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化。

下面是一个例子,在Scala集合 trait TraversableOnce 定义了 foldLeft

代码语言:javascript
复制
代码语言:javascript
复制
def foldLeft[B](z: B)(op: (B, A) => B): B

foldLeft从左到右,以此将一个二元运算op应用到初始值z和该迭代器(traversable)的所有元素上。以下是该函数的一个用例:

从初值0开始, 这里 foldLeft 将函数 (m, n) => m + n 依次应用到列表中的每一个元素和之前累积的值上。

代码语言:javascript
复制
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.foldLeft(0)((m, n) => m + n)
print(res)

多参数列表有更复杂的调用语法,因此应该谨慎使用,建议的使用场景包括:

单一的函数参数

在某些情况下存在单一的函数参数时,例如上述例子foldLeft中的op,多参数列表可以使得传递匿名函数作为参数的语法更为简洁。如果不使用多参数列表,代码可能像这样:

代码语言:javascript
复制
代码语言:javascript
复制
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})

注意使用多参数列表时,我们还可以利用Scala的类型推断来让代码更加简洁(如下所示),而如果没有多参数列表,这是不可能的。

代码语言:javascript
复制
代码语言:javascript
复制
numbers.foldLeft(0)(_ + _)

像上述语句这样,我们可以给定多参数列表的一部分参数列表(如上述的z)来形成一个新的函数(partially applied function),达到复用的目的,如下所示:

代码语言:javascript
复制
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val numberFunc = numbers.foldLeft(List[Int]())_

val squares = numberFunc((xs, x) => xs:+ x*x)
print(squares.toString())

val cubes = numberFunc((xs, x) => xs:+ x*x*x)
print(cubes.toString())

最后,foldLeftfoldRight 可以按以下任意一种形式使用,

代码语言:javascript
复制
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

numbers.foldLeft(0)((sum, item) => sum + item) 
numbers.foldRight(0)((sum, item) => sum + item)

numbers.foldLeft(0)(_+_) 
numbers.foldRight(0)(_+_)

(0 /: numbers)(_+_) 
(numbers :\ 0)(_+_)
隐式(implicit)参数

如果要指定参数列表中的某些参数为隐式(implicit),应该使用多参数列表。例如:

代码语言:javascript
复制
代码语言:javascript
复制
def execute(arg: Int)(implicit ec: ExecutionContext) = ???
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浪尖聊大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单一的函数参数
  • 隐式(implicit)参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档