curry翻译为中文就是咖喱。意为使用curry可以让代码更有味道。

scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表。也就是说我们要编写的函数不是只有一个参数列表,这个参数列表中有多个参数以逗号分隔;而是一个函数中有多个参数列表,每个参数列表中只有一个参数(当然,也可以有多个参数)。也就是说我们写的函数不再只是这样子的:

def foo(a: Int, b: Int, c: Int) {}

而是这样子的:foo(1)(2)(3),或者这样的:foo(1){2}{3},甚至是这样子的:foo{1}{2}{3}。

来看一下定义成多个参数列表的方法到底是什么样的。这次使用scala交互式shell会话:

按照上面所说我们定义了一个函数foo()。然后,调用foo_创建了一个偏应用函数,也就是说,这个函数有一个或多个参数未绑定。关于偏应用函数稍后会详细说,这次主要关注交互式shell提供的消息:先是三个一连串的转换,链中的每个函数都接收一个Int,返回一个偏应用函数。不过,最后一个的结果是Unit。

现在可以使用curry化的形式重写一下inject方法:

def inject(arr: Array[Int], initial: Int)(operation: (Int, Int) => Int): Int = {
var carryOver = initial
arr.foreach(element => carryOver = operation(carryOver, element))
carryOver
}

这样一来,我们就不必在一个参数列表里用逗号分割的形式传递参数了。现在可以使用圆括号或花括号独立传递参数了:

val array = Array(2, 3, 5, 1, 6, 4)
val sum = inject(array, array(0)){
(carryOver, elem) => Math.max(carryOver, elem)
}
println("Max of elements in array [" + array.mkString(",") + "] is " + sum)

是不是看起来更优雅了——虽然刚见到的时候理解有些困难,但是熟悉了这种语法后还是能体会到它的好处的。

########

最新文章

  1. 未找到数据,异常处理:exception when no_data_found then 异常处理语句;
  2. 从来没有天才 靠自己创造未来——Leo鉴书(29)
  3. Perl中的特殊内置变量详解
  4. [BZOJ 4033] [HAOI2015] T1 【树形DP】
  5. 在防火墙的例外中注册程序(Windows7和XP),改写注册表
  6. wamp You don't have permission to access / on this server等问题的解决.
  7. CentOS+OpenCV图像的读入、显示
  8. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器
  9. 开源API集成测试工具 Hitchhiker v0.1.3 - 参数化请求
  10. Linux下批量修改文件名方法
  11. 【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现
  12. SVProgressHUD提示框IOS
  13. Apache配置默认主页
  14. [LeetCode] 661. Image Smoother_Easy
  15. ORACLE RAC 11.2.0.4 CentOS release 6.9 静默安装1.0版本
  16. Maven之java application _HelloWord
  17. 100度享乐电商网 html
  18. MFC函数—— CFrameWnd::OnCreateClient
  19. B/S与C/S的比较
  20. JQuery的Ajax跨域请求的解决方式

热门文章

  1. 【文章阅读】详解MySQL数据类型
  2. Minecraft Forge编程入门三 “初始化项目结构和逻辑”
  3. Shell正则表达式和文本处理工具
  4. Python位运算符
  5. window下安装php的imagick和imagemagick扩展教程
  6. CKEditor的下载、配置与使用
  7. Appium的Java封装
  8. IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机验证码
  9. nginx_cdn配置
  10. virtualenv使用