scala 部分應用函式與偏函式

2021-09-27 01:27:42 字數 3771 閱讀 6066

部分應用函式:是指乙個函式有n個引數, 而我們為其提供少於n個引數, 那就得到了乙個部分應用函式.

def sum

(a:int,b:int,c:int)

= a + b + c;

那麼就可以從這個函式衍生出乙個偏函式是這樣的:

def p_sum =

sum(

1, _:int, _:int)

於是就可以這樣呼叫p_sum(2,3), 相當於呼叫sum(1,2,3) 得到的結果是6. 這裡的兩個_分別對應函式sum對應位置的引數. 所以你也可以定義成

def p_sum = sum (_:int,

1, _:int)

偏函式定義:用一對大括號括起來的一系列的 case 語句

偏函式的引出,先看一段需求案例:將 list(1, 2, 3, "abc", false) 的非數字 忽略, 將數字 + 1 並返回

def

main

(args: array[string]

): unit =")

//解決方式二: 模式匹配, 比上面的方法簡單, 但是不夠完美

val list2: list[int]

=list

.filter

(x =

> x.isinstanceof[int]).

map(x =

>})

println(s"模式匹配的方式: $"

)}

執行結果:

filter

+map 的方式:2,

3,4模式匹配的方式:2,

3,4

上面的兩種解決方式比較麻煩,我們使用偏函式解決上述需求:

//

1. 定義乙個偏函式//2

. partialfunction[any, int]

: 表示偏函式接受的引數型別是 any, 返回型別 int//3

. isdefinedat(x: any)//4

.1, 並返回(新的集合)

val partialfun: partialfunction[any, int]

= new partialfunction[any, int]

override def

(v1: any)

: int =

}//使用偏函式

//如果使用偏函式, 則不能使用 map

, 應該使用 collect

val list3: list[int]

=list

.collect(partialfun)

println(s"list3: $"

)

執行結果:

x=1v=

1x=2v=

2x=3v=

3x=abc

x=false

list3:2,

3,4

偏函式的簡寫

def partialfun2: partialfunction[any, int]

=val list4: list[int]

= list.

collect

(partialfun2)

println

(s"list4: $"

)

執行結果:

list4:2,

3,4

偏函式的簡寫再簡寫

//再簡寫

val list5=

list

.collect(

)println(s"list5: $"

)

執行結果:

list5:2,

3,4

下面看兩個偏函式的例項:

偏函式的應用:將 集合中的數字 * 2

//因為 map 只能調整資料型別, 無法改變 集合 的長度, 所以結果會有空值

val list1 =

list(1

,2,4

,"abc"

,false

)val list2: list[anyval]

= list1.

map(

)println

(s"list2: $"

)// list2: 1,4,16,(),()

//collect => filter + map 能做到 過濾 和 map 的組合操作

val list3: list[int]

= list1.

collect()

println

(s"list3: $"

)// list3: 1, 4, 16

偏函式的應用:將 map 的資料重組, 並將新的 map 返回出來

val map: map[int,

(int, int)]=

map(1-

>(2

,20),

10->(20

,30),

20->(30

,40))

val map1 = map.

map(

)println

(s"map1: ($)"

)// map1: (1 -> 20), (10 -> 30), (20 -> 40)

偏函式零碎**:

/

*** 如果你想定義乙個函式, 而讓它只接受和處理其引數定義域範圍內的子集,

* 對於這個引數範圍外的引數則丟擲異常, 這樣的函式就是偏函式(這個函式只處理傳入來的部分引數)*/

defmain

(args: array[string]

): unit =

//上面的偏函式定義麻煩, 偏函式與 scala 語句結合起來能使**更簡潔, 如下

val divide2: partialfunction[int, int]

=//println(

"沒有用偏函式的部分應用函式: "

+divide1(10)

)//println(

"用了偏函式的部分應用函式: "

+divide2(10)

) val rs: partialfunction[int, string]

=//println(rs(1)

)//orelse: 將多個偏函式組合起來使用, 結合起來的效果類似 case 語句

// 但是每個偏函式裡又可以再使用case

val or1 : partialfunction[int, string]

= val or2 : partialfunction[int, string]

= val or_ : partialfunction[int, string]

= val or

= or1 orelse or2 orelse or_

println(or(

2))}

Scala部分函式 偏函式

例如 def sum x int,y int,z int x y z,當呼叫sum的時候,如果不提供所有的引數,或者只提供某些引數時,比如sum sum 3,int,int sum int,3,4 這樣就生成了所謂的部分應用函式。案例 def showmsg title string content...

偏函式與部分應用函式

首先偏函式是個數學概念,偏函式不是 函式 的一種,而是乙個跟函式平行的概念.定義可參考wiki 它是指定義域x中可能存在某些值在值域y中沒有對應的值.scala可以通過模式匹配來定義偏函式,下面這兩種方式定義的函式,都可以認為是偏函式,因為他們都只對其定義域int的部分值做了處理.那麼像p1哪有定義...

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

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