常常把部分應用函數(Partial Applied Function)和偏函數(Partial Function) 搞混。 函數
本人總結以下: scala
- 部分應用函數(Partial Applied Function)是缺乏部分參數的函數,是一個邏輯上概念
- 偏函數是隻對函數定義域的一個子集進行定義的函數。 scala中用scala.PartialFunction[-T, +S]類來表示
好比定義了一個函數:def sum(x: Int)(y: Int) = x + y, 當調用sum的時候,若是不提供全部的參數或某些參數還未知時,好比sum _ , sum(3)(_: Int), sum(_: Int)(3), 這樣就生成了所謂的部分應用函數。部分應用函數只是邏輯上的一個表達,scala編譯器會用Function1, Function2這些類來表示它.
下面這個變量signal引用了一個偏函數
val signal: PartialFunction[Int, Int] = {
case x if x > 1 => 1
case x if x < -1 => -1
}
這個signal所引用的函數除了0值外,對全部整數都定義了相應的操做。 signal(0) 會拋出異常,所以使用前最好先signal.isDefinedAt(0)判斷一下。 偏函數主要用於這樣一種場景:對某些值如今還沒法給出具體的操做(即需求還不明朗),也有可能存在幾種處理方式(視乎具體的需求);咱們能夠先對需求明確的部分進行定義,好比上述除了0外的全部整數域,而後根據具體狀況補充對其餘域的定義,好比 :
val composed_signal: PartialFunction[Int,Int] = signal.orElse{
case 0 => 0
}
composed_signal(0) // 返回 0
或者對定義域進行必定的偏移(假如需求作了變動, 1 爲無效的點)
val new_signal: Function1[Int, Int] = signal.compose{
case x => x - 1
}
new_signal(1) // throw exception
new_signal(0) // 返回 -1
new_signal(2) // 返回 1
還能夠用andThen將兩個相關的偏函數串接起來
val another_signal: PartialFunction[Int, Int] = {
case 0 => 0
case x if x > 0 => x - 1
case x if x < 0 => x + 1
}
val then_signal = another_signal andThen signal
這裏的then_signal 剔除了-1, 0, 1三個點的定義