第九章 控制抽象

来源:互联网 发布:什么是审计作业软件 编辑:程序博客网 时间:2024/05/17 09:36

在上一章中学习了函数值的概念,本章将要学习如何将函数值应用到创建新的控制抽象。

  • 简化代码

    • 所有的函数都可以分为通用部分和非通用部分
      • 通用部分是函数体
      • 非通用部分必须由参数提供
    • 我们将这样的函数称为高阶函数,这使得我们有机会去组织和简化代码
        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方法将其评估,而这个函数值则会传递给调用函数
0 0
原创粉丝点击