scala学习手记25 - Curry化
2024-08-26 01:02:02
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)
是不是看起来更优雅了——虽然刚见到的时候理解有些困难,但是熟悉了这种语法后还是能体会到它的好处的。
########
最新文章
- 未找到数据,异常处理:exception when no_data_found then 异常处理语句;
- 从来没有天才 靠自己创造未来——Leo鉴书(29)
- Perl中的特殊内置变量详解
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
- 在防火墙的例外中注册程序(Windows7和XP),改写注册表
- wamp You don't have permission to access / on this server等问题的解决.
- CentOS+OpenCV图像的读入、显示
- 只需要一点点C++基础,新手也可以制作单机游戏内存修改器
- 开源API集成测试工具 Hitchhiker v0.1.3 - 参数化请求
- Linux下批量修改文件名方法
- 【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现
- SVProgressHUD提示框IOS
- Apache配置默认主页
- [LeetCode] 661. Image Smoother_Easy
- ORACLE RAC 11.2.0.4 CentOS release 6.9 静默安装1.0版本
- Maven之java application _HelloWord
- 100度享乐电商网 html
- MFC函数—— CFrameWnd::OnCreateClient
- B/S与C/S的比较
- JQuery的Ajax跨域请求的解决方式