1. 程式人生 > >8、高階函數

8、高階函數

star 參數 obj override name current 高階函數 str math

普通函數

高階函數:參數或返回值是函數

object a_基礎 {
  def main(args: Array[String]): Unit = {
    println(mymax(1,2,math.max))

    println(myadd(1)(2))
  }

  def mymax(a:Int,b:Int,f:(Int,Int) => Int)={  //f類型的映射即函數
    f(a,b)
  }

  def myadd(a:Int)={  //返回值類型是函數,inner _ 表示函數本身
    def inner(b:Int)={
      a + b
    }
    inner _
  }
}

匿名函數

scala> arr.map((i:Int) => i*2:Int)  //寫明返回值類型
res24: Array[Int] = Array(2, 4)

scala> arr.map((i:Int) => i*2)    //推斷返回值類型
res25: Array[Int] = Array(2, 4)
scala> arr.map((i) => i*2)    //類型推斷
res29: Array[Int] = Array(2, 4)

scala> arr.map(i => i*2)    //再簡化
res30: Array[Int] 
= Array(2, 4)
scala> arr.map(_*2)  //i就出現了一次,最終版
res32: Array[Int] = Array(2, 4)

柯裏化

定義:將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。即柯裏化後的函數返回以原來第二個參數作為參數的函數

scala> def add(a:Int,b:Int)=a+b  //原函數
add: (a: Int, b: Int)Int^

scala> def add(a:Int)={b:Int => a + b}  //柯裏化
add: (a: Int)Int => Int

scala> add(1
)(2) res0: Int = 3 scala> def add(a:Int)(b:Int) =a + b  //柯裏化簡化 add: (a: Int)(b: Int)Int scala> add(3)(4) res1: Int = 7

好處:將某個參數單獨拎出來,以提供更多用於類型推斷的信息

控制抽象

在scala中,一系列語句可組成不帶參數也沒有返回值的函數

object c_控制抽象 {
  def main(args: Array[String]): Unit = {
    runinthread(println(Thread.currentThread().getName()))
    runinthread(println(Thread.currentThread().getName()))
  }

  def runinthread(block: => Unit): Unit ={
    new Thread() {
      override def run(): Unit ={
        block
      }
    }.start()
  }

}

8、高階函數