企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在上一章中学习了函数值的概念,本章将要学习如何将函数值应用到创建新的控制抽象。 - 简化代码 - 所有的函数都可以分为通用部分和非通用部分 - 通用部分是函数体 - 非通用部分必须由参数提供 - 我们将这样的函数称为高阶函数,这使得我们有机会去组织和简化代码 ~~~ def containsNeg(nums: List[Int]):Boolean = { var exists = false; for(num <- nums) if(num < 0) exists = ture; exists; } ~~~ ~~~ 如果我们在这里使用高阶函数exists: ~~~ ~~~ def containsNeg(nums: List[Int]):Boolean = nums.exists(_ < 0); ~~~ ~~~ 就是如此的简洁! ~~~ - 柯里化 - 柯里化的函数被应用于多个参数列表,而不仅仅一个 ~~~ def curriendSum(x: Int, y: Int) = { x + y; } ~~~ 可以写作: ~~~ def curriendSum(x: Int)(y: Int) = { x + y; } ~~~ 还可以写作: ~~~ def curriendSum(x: Int) = { (y: Int) => x + y; } ~~~ - 编写新的控制抽象 - 对于多个参数,先做柯里化 - 在传入一个参数时,可以用花括号代替小括号达到更像控制抽象的效果 ~~~ def twice(x: Double, op: Double => Double) = op(op(x)); ~~~ ~~~ 改写: ~~~ ~~~ def twice(x: Double)(op: Double => Double) = op(op(x)); ~~~ ~~~ 调用 ~~~ ~~~ twice(5) { _ + 1; } ~~~ ~~~ 这样看起来就更加像是内建的控制抽象了。 ~~~ - 传名参数 - 要实现传名参数,要定义参数的类型开始与 => 而不是 ()=> - 需要将 ()=> 转换成 => - 括号内的表达式不会先于调用函数被评估,而是创建一个函数值,其apply方法将其评估,而这个函数值则会传递给调用函数