1. 程式人生 > 其它 >Scala 速通語法(十三)| 函數語言程式設計

Scala 速通語法(十三)| 函數語言程式設計

函數語言程式設計

偏函式 partial function

  • 偏函式:對某個符合條件的,而不是所有情況進行邏輯操作時,使用偏函式
  • 將包在大括號內的一組case語句封裝為函式,我們稱之為偏函式,她只會作用於指定型別的引數,或者指定範圍值的引數實施計算,超出範圍的值另行處理
  • 偏函式在scala中是一個特質,PartialFunction
  val list = List(1,2,3,4,"哈哈哈")

  /***
   * 定義一個偏函式
   * 1. 輸入為Any 輸出為Int
   * 2. isDefinedAt(x: Any) 判斷條件是否成立 ture 則執行 apply(v1: Any) false 則不執行
   * 3. apply(v1: Any) 對經過 isDefinedAt(x: Any) 過濾的值進行邏輯處理 v1為上函式 x
   */
  val  pf = new PartialFunction[Any,Int] {
    override def isDefinedAt(x: Any): Boolean = {
      x.isInstanceOf[Int]
    }

    override def apply(v1: Any): Int = {
      v1.asInstanceOf[Int]+1
    }
  }

  //map不能傳入偏函式 偏函式型別為物件 需要用collect
  println(list.collect(pf))


  /**
   * 偏函式簡寫
   */

  def pf2 : PartialFunction[Any,Int] = {
    case i:Int => i + 1
    case i>0 => i
  }

  println(list.collect(pf2))

匿名函式

  • 可以通過函式表示式來設定匿名函式
//對匿名函式的說明
//1. 不需要寫 def 函式名
//2. 不需要寫返回型別,使用型別推導
//3. = 變成 =>
//4. 如果有多行,則使用{} 包括
val triple = (x: Double) => {
  println("x=" + x)
  3 * x
}

閉包(closure)

  • 閉包就是一個函式和與其相關的引用環境組合的一個整體(實體)

函式柯里化(curry)

  • 函式程式設計中,接受多個引數的函式都可以轉化為接受單個引數的函式,這個轉化過程就叫柯里化
  • 柯里化證明了函式只需要一個引數
//說明
def mul(x: Int, y: Int) = x * y
println(mul(10, 10))

def mulCurry(x: Int) = (y: Int) => x * y
println(mulCurry(10)(9))

def mulCurry2(x: Int)(y:Int) = x * y
println(mulCurry2(10)(8))