本人總結(jié)如下:?
部分應(yīng)用函數(shù) 就是調(diào)用時(shí)少參數(shù)
偏函數(shù)是只表達(dá)了定義域的一部分陶缺。 scala中用scala.PartialFunction[-T, +S]類來(lái)表示
部分應(yīng)用函數(shù):def sum(x: Int)(y: Int) = x + y, 當(dāng)調(diào)用sum的時(shí)候,調(diào)用時(shí)少參數(shù)洁灵,比如sum _ , sum(3)(_: Int), sum(_: Int)(3), 這樣就生成了所謂的部分應(yīng)用函數(shù)饱岸。部分應(yīng)用函數(shù)只是邏輯上的一個(gè)表達(dá),scala編譯器會(huì)用Function1徽千, Function2這些類來(lái)表示它. ?
下面 定義一個(gè)偏函數(shù):
val signal: PartialFunction[Int, Int] = {
? ? case x if x > 1 => 1
? ? case x if x < -1 => -1
}
這個(gè)signal所引用的函數(shù)除了0值外苫费,對(duì)所有整數(shù)都定義了相應(yīng)的操作。 signal(0) 會(huì)拋出異常双抽,因此使用前最好先signal.isDefinedAt(0)判斷一下百框。 偏函數(shù)主要用于這樣一種場(chǎng)景:對(duì)某些值現(xiàn)在還無(wú)法給出具體的操作(即需求還不明朗),也有可能存在幾種處理方式牍汹;我們可以先對(duì)需求明確的部分進(jìn)行定義铐维,比如上述除了0外的所有整數(shù)域柬泽,然后根據(jù)具體情況補(bǔ)充對(duì)其他域的定義,比如 :
val composed_signal: PartialFunction[Int,Int] = signal.orElse{
case 0 => 0
}
composed_signal(0) ?// 返回 0?
或者對(duì)定義域進(jìn)行一定的偏移(假如需求做了變更, ?1 為無(wú)效的點(diǎn))
? case x => x ?- 1
}
new_signal(1) ?// throw exception
new_signal(0) ? // 返回 -1?
new_signal(2) ?// 返回 1
還可以用andThen將兩個(gè)相關(guān)的偏函數(shù)串接起來(lái)
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三個(gè)點(diǎn)的定義