第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

scala中方法和函數(shù)的區(qū)別

scala中方法和函數(shù)的區(qū)別

ABOUTYOU 2019-04-12 11:06:23
scala中方法和函數(shù)的區(qū)別
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊

總結(jié)如下:
部分應(yīng)用函數(shù)(Partial Applied Function)是缺少部分參數(shù)的函數(shù),是一個(gè)邏輯上概念

偏函數(shù)是只對(duì)函數(shù)定義域的一個(gè)子集進(jìn)行定義的函數(shù)。 scala中用scala.PartialFunction[-T, +S]類來表示
比如定義了一個(gè)函數(shù):def sum(x: Int)(y: Int) = x + y, 當(dāng)調(diào)用sum的時(shí)候,如果不提供所有的參數(shù)或某些參數(shù)還未知時(shí),比如sum _ , sum(3)(_: Int), sum(_: Int)(3), 這樣就生成了所謂的部分應(yīng)用函數(shù)。部分應(yīng)用函數(shù)只是邏輯上的一個(gè)表達(dá),scala編譯器會(huì)用Function1, Function2這些類來表示它.
下面這個(gè)變量signal引用了一個(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)在還無法給出具體的操作(即需求還不明朗),也有可能存在幾種處理方式(視乎具體的需求);我們可以先對(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 為無效的點(diǎn))
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將兩個(gè)相關(guān)的偏函數(shù)串接起來
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)的定義



查看完整回答
反對(duì) 回復(fù) 2019-04-13
?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

部分應(yīng)用函數(shù):
  你還可以使用單個(gè)“_”替換整個(gè)參數(shù)列表。例如可以寫成:
  List(1,2,3,4,5).foreach(println(_))
  或者更好的方法是你還可以寫成:
  List(1,2,3,4,5).foreach(println _)
  以這種方式使用下劃線時(shí),你就正在寫一個(gè)部分應(yīng)用函數(shù)。部分應(yīng)用函數(shù)是一種表達(dá)式,你不需要提供函數(shù)需要的所有參數(shù),代之以僅提供部分,或不提供所需參數(shù)。如下先定義一個(gè)函數(shù),然后創(chuàng)建一個(gè)部分應(yīng)用函數(shù),并保存于變量,然后該變量就可以作為函數(shù)使用:
  def sum(a: Int, b: Int, c: Int) = a + b + c
  val a = sum _
  println(a(1,2,3))
  實(shí)際發(fā)生的事情是這樣的:名為a的變量指向一個(gè)函數(shù)值對(duì)象,這個(gè)函數(shù)值是由scala編譯器依照部分應(yīng)用函數(shù)表達(dá)式sum _,自動(dòng)產(chǎn)生的類的一個(gè)實(shí)例。編譯器產(chǎn)生的類有一個(gè)apply方法帶有3個(gè)參數(shù)(之所以帶3個(gè)參數(shù)是因?yàn)閟um _表達(dá)式缺少的參數(shù)數(shù)量為3),然后scala編譯器把表達(dá)式a(1,2,3)翻譯成對(duì)函數(shù)值的apply方法的調(diào)用。你可以使用這種方式把成員函數(shù)和本地函數(shù)轉(zhuǎn)換為函數(shù)值,進(jìn)而在函數(shù)中使用它們。不過,你還可以通過提供某些但不是全部需要的參數(shù)表達(dá)一個(gè)部分應(yīng)用函數(shù)。如下,此變量在使用的時(shí)候,可以僅提供一個(gè)參數(shù):
  val b = sum(1, _: Int, 3)
  如果你正在寫一個(gè)省略所有參數(shù)的部分應(yīng)用函數(shù)表達(dá)式,如println _或sum _,而且在代碼的那個(gè)地方正需要一個(gè)函數(shù),你就可以省略掉下劃線(不是需要函數(shù)的地方,你這樣寫,編譯器可能會(huì)把它當(dāng)作一個(gè)函數(shù)調(diào)用,因?yàn)樵趕cala中,調(diào)用無副作用的函數(shù)時(shí),默認(rèn)不加括號(hào))。如下代碼就是:
  List(1,2,3,4,5).foreach(println)

偏函數(shù):
  偏函數(shù)和部分應(yīng)用函數(shù)是無關(guān)的。偏函數(shù)是只對(duì)函數(shù)定義域的一個(gè)子集進(jìn)行定義的函數(shù)。scala中用scala.PartialFunction[-T,+S]來表示。偏函數(shù)主要用于這樣一種場(chǎng)景:對(duì)某些值現(xiàn)在還無法給出具體的操作(即需求還不明朗),也有可能存在幾種處理方式(視乎具體的需求),我們可以先對(duì)需求明確的部分進(jìn)行定義,以后可以再對(duì)定義域進(jìn)行修改。PartialFunction中可以使用的方法如下:
  isDefinedAt:判斷定義域是否包含指定的輸入。
  orElse:補(bǔ)充對(duì)其他域的定義。
  compose:組合其他函數(shù)形成一個(gè)新的函數(shù),假設(shè)有兩個(gè)函數(shù)f和g,那么表達(dá)式f _ compose g _則會(huì)形成一個(gè)f(g(x))形式的新函數(shù)。你可以使用該方法對(duì)定義域進(jìn)行一定的偏移。
  andThen:將兩個(gè)相關(guān)的偏函數(shù)串接起來,調(diào)用順序是先調(diào)用第一個(gè)函數(shù),然后調(diào)用第二個(gè),假設(shè)有兩個(gè)函數(shù)f和g,那么表達(dá)式f _ andThen g _則會(huì)形成一個(gè)g(f(x))形式的新函數(shù),剛好與compose相反。


 


查看完整回答
反對(duì) 回復(fù) 2019-04-13
  • 2 回答
  • 0 關(guān)注
  • 721 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)