scala中的部分應用函式和偏函式的區別

2021-07-10 01:41:41 字數 1707 閱讀 5830

偏函式是只對函式定義域的乙個子集進行定義的函式。 scala中用scala.partialfunction[-t, +s]類來表示

比如定義了乙個函式:def sum(x: int)(y: int) = x + y, 當呼叫sum的時候,如果不提供所有的引數或某些引數還未知時,比如sum _ , sum(3)(_: int), sum(_: int)(3), 這樣就生成了所謂的部分應用函式。部分應用函式只是邏輯上的乙個表達,scala編譯器會用function1, function2這些類來表示它.

//部分應用函式

def sum(x: int)(y: int) = x + y

val sum1 = sum _

println(sum1(1)(2)) //3

val sum2 = sum(1) _

// val sum2 = sum(1)(_)

// val sum2 = sum(1)(_:int)

println(sum2(3)) //4

val sum3 = sum(_:int)(4)

println(sum3(1)) //5 }

下面這個變數signal引用了乙個偏函式

val signal: partialfunction[int, int] = 

println(signal(1)) //1

println(signal(0)) //matcherror

這個signal所引用的函式除了0值外,對所有整數都定義了相應的操作。 signal(0) 會丟擲異常,因此使用前最好先signal.isdefinedat(0)判斷一下。 

偏函式主要用於這樣一種場景:對某些值現在還無法給出具體的操作(即需求還不明朗),也有可能存在幾種處理方式(視乎具體的需求);我們可以先對需求明確的部分進行定義,比如上述除了0外的所有整數域,然後根據具體情況補充對其他域的定義

比如

val composed_signal: partialfunction[int, int] = signal.orelse 

println(composed_signal(0)) //0

或者

對定義域進行一定的偏移

(假如需求做了變更,  1 為無效的點)

val new_signal: function1[int, int] = signal.compose 

println(new_signal(2)) //1

println(new_signal(0)) //-1

println(new_signal(1)) //matcherror

還可以

用andthen將兩個相關的偏函式串接起來

val another_signal: partialfunction[int, int] = 

val then_signal = another_signal andthen signal

//這裡的then_signal 剔除了-1, 0, 1三個點的定義

scala中的部分應用函式和偏函式的區別

本人總結如下 偏函式是只對函式定義域的乙個子集進行定義的函式。scala中用scala.partialfunction t,s 類來表示 比如定義了乙個函式 def sum x int y int x y,當呼叫sum的時候,如果不提供所有的引數或某些引數還未知時,比如sum sum 3 int s...

scala中的部分應用函式和偏函式的區別

這裡做個簡單的總結 以下的討論基於 scala 2.8 下面這個變數signal引用了乙個偏函式 val signal partialfunction int,int 這個signal所引用的函式除了0值外,對所有整數都定義了相應的操作。signal 0 會丟擲異常,因此使用前最好先signal.i...

scala 部分應用函式與偏函式

部分應用函式 是指乙個函式有n個引數,而我們為其提供少於n個引數,那就得到了乙個部分應用函式.def sum a int,b int,c int a b c 那麼就可以從這個函式衍生出乙個偏函式是這樣的 def p sum sum 1,int,int 於是就可以這樣呼叫p sum 2,3 相當於呼叫...