精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Scala的偏應(yīng)用函數(shù)

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第八章。Scala是一種針對 JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語言。

盡管前面的例子里下劃線替代的只是單個參數(shù),你還可以使用一個下劃線替換整個參數(shù)列表。例如,寫成println(_),或者更好的方法你還可以寫成println _。下面是一個例子:

  1. someNumbers.foreach(println _)  

51CTO編輯推薦:Scala編程語言專題

Scala把這種短格式直接看作是你輸入了下列代碼:

  1. someNumbers.foreach(x => println(x)) 
因此,這個例子中的下劃線不是單個參數(shù)的占位符。它是整個參數(shù)列表的占位符。請記住要在函數(shù)名和下劃線之間留一個空格,因?yàn)椴贿@樣做編譯器會認(rèn)為你是在說明一個不同的符號,比方說是,似乎不存在的名為println_的方法。

以這種方式使用下劃線時,你就正在寫一個偏應(yīng)用函數(shù):partially applied function。Scala里,當(dāng)你調(diào)用函數(shù),傳入任何需要的參數(shù),你就是在把函數(shù)應(yīng)用到參數(shù)上。如,給定下列函數(shù):

  1. scala> def sum(a: Int, b: Int, c: Int) = a + b + c  
  2. sum: (Int,Int,Int)Int  
你就可以把函數(shù)sum應(yīng)用到參數(shù)1,2和3上,如下:

  1. scala> sum(123)  
  2. res12: Int = 6 
偏應(yīng)用函數(shù)是一種表達(dá)式,你不需要提供函數(shù)需要的所有參數(shù)。代之以僅提供部分,或不提供所需參數(shù)。比如,要創(chuàng)建不提供任何三個所需參數(shù)的調(diào)用sum的偏應(yīng)用表達(dá)式,只要在“sum”之后放一個下劃線即可。然后可以把得到的函數(shù)存入變量。舉例如下:

  1. scala> val a = sum _  
  2. a: (Int, Int, Int) => Int = < function>  
有了這個代碼,Scala編譯器以偏應(yīng)用函數(shù)表達(dá)式,sum _,實(shí)例化一個帶三個缺失整數(shù)參數(shù)的函數(shù)值,并把這個新的函數(shù)值的索引賦給變量a。當(dāng)你把這個新函數(shù)值應(yīng)用于三個參數(shù)之上時,它就轉(zhuǎn)回頭調(diào)用sum,并傳入這三個參數(shù):

  1. scala> a(123)  
  2. res13: Int = 6 
實(shí)際發(fā)生的事情是這樣的:名為a的變量指向一個函數(shù)值對象。這個函數(shù)值是由Scala編譯器依照偏應(yīng)用函數(shù)表達(dá)式sum _,自動產(chǎn)生的類的一個實(shí)例。編譯器產(chǎn)生的類有一個apply方法帶三個參數(shù)。產(chǎn)生的類擴(kuò)展了特質(zhì)Function3,定義了三個參數(shù)的apply方法。之所以帶三個參數(shù)是因?yàn)閟um _表達(dá)式缺少的參數(shù)數(shù)量為三。Scala編譯器把表達(dá)式a(1,2,3)翻譯成對函數(shù)值的apply方法的調(diào)用,傳入三個參數(shù)1,2,3。因此a(1,2,3)是下列代碼的短格式:

  1. scala> a.apply(123)  
  2. res14: Int = 6 
Scala編譯器根據(jù)表達(dá)式sum _自動產(chǎn)生的類里的apply方法,簡單地把這三個缺失的參數(shù)前轉(zhuǎn)到sum,并返回結(jié)果。本例中apply調(diào)用了sum(1,2,3),并返回sum返回的,6。

這種一個下劃線代表全部參數(shù)列表的表達(dá)式的另一種用途,就是把它當(dāng)作轉(zhuǎn)換def為函數(shù)值的方式。例如,如果你有一個本地函數(shù),如sum(a: Int, b: Int, c: Int): Int,你可以把它“包裝”在apply方法具有同樣的參數(shù)列表和結(jié)果類型的函數(shù)值中。當(dāng)你把這個函數(shù)值應(yīng)用到某些參數(shù)上時,它依次把sum應(yīng)用到同樣的參數(shù),并返回結(jié)果。盡管不能把方法或嵌套函數(shù)賦值給變量,或當(dāng)作參數(shù)傳遞給其它方法,但是如果你把方法或嵌套函數(shù)通過在名稱后面加一個下劃線的方式包裝在函數(shù)值中,就可以做到了。

現(xiàn)在,盡管sum _確實(shí)是一個偏應(yīng)用函數(shù),或許對你來說為什么這么稱呼并不是很明顯。這個名字源自于函數(shù)未被應(yīng)用于它所有的參數(shù)。在sum _的例子里,它沒有應(yīng)用于任何參數(shù)。不過還可以通過提供某些但不是全部需要的參數(shù)表達(dá)一個偏應(yīng)用函數(shù)。舉例如下:

  1. scala> val b = sum(1, _: Int, 3)  
  2. b: (Int) => Int = < function> 
這個例子里,你提供了***個和***一個參數(shù)給sum,但中間參數(shù)缺失。因?yàn)閮H有一個參數(shù)缺失,Scala編譯器會產(chǎn)生一個新的函數(shù)類,其apply方法帶一個參數(shù)。在使用一個參數(shù)調(diào)用的時候,這個產(chǎn)生的函數(shù)的apply方法調(diào)用sum,傳入1,傳遞給函數(shù)的參數(shù),還有3。如下:

  1. scala> b(2)  
  2. res15: Int = 6 
這個例子里,b.apply調(diào)用了sum(1,2,3)。

  1. scala> b(5)  
  2. res16: Int = 9 
這個例子里,b.apply調(diào)用了sum(1,5,3)。

如果你正在寫一個省略所有參數(shù)的偏應(yīng)用程序表達(dá)式,如println _或sum _,而且在代碼的那個地方正需要一個函數(shù),你可以去掉下劃線從而表達(dá)得更簡明。例如,代之以打印輸出someNumbers里的每一個數(shù)字(定義在第113頁)的這種寫法:

  1. someNumbers.foreach(println _)  
你可以只是寫成:

  1. someNumbers.foreach(println)  
***一種格式僅在需要寫函數(shù)的地方,如例子中的foreach調(diào)用,才能使用。編譯器知道這種情況需要一個函數(shù),因?yàn)閒oreach需要一個函數(shù)作為參數(shù)傳入。在不需要函數(shù)的情況下,嘗試使用這種格式將引發(fā)一個編譯錯誤。舉例如下:

  1. scala> val c = sum  
  2. < console>:5: error: missing arguments for method sum...  
  3. follow this method with `_' if you want to treat it as  
  4.  a partially applied function  
  5.  val c = sum  
  6.  ˆ  
  7. scala> val d = sum _  
  8. d: (Int, Int, Int) => Int = < function>  
  9. scala> d(102030)  
  10. res17: Int = 60 
為什么要使用尾下劃線?

Scala的偏應(yīng)用函數(shù)語法凸顯了Scala與經(jīng)典函數(shù)式語言如Haskell或ML之間,設(shè)計(jì)折中的差異。在經(jīng)典函數(shù)式語言中,偏應(yīng)用函數(shù)被當(dāng)作普通的例子。更進(jìn)一步,這些語言擁有非常嚴(yán)格的靜態(tài)類型系統(tǒng)能夠暴露出你在偏應(yīng)用中可能犯的所有錯誤。Scala與指令式語言如Java關(guān)系近得多,在這些語言中沒有應(yīng)用所有參數(shù)的方法會被認(rèn)為是錯誤的。進(jìn)一步說,子類型推斷的面向?qū)ο蟮膫鹘y(tǒng)和全局的根類型接受一些被經(jīng)典函數(shù)式語言認(rèn)為是錯誤的程序。

舉例來說,如果你誤以為List的drop(n: Int)方法如tail(),那么你會忘記你需要傳遞給drop一個數(shù)字。你或許會寫,“println(drop)”。如果Scala采用偏應(yīng)用函數(shù)在哪兒都OK的經(jīng)典函數(shù)式傳統(tǒng),這個代碼就將通過類型檢查。然而,你會驚奇地發(fā)現(xiàn)這個println語句打印的輸出將總是< function>!可能發(fā)生的事情是表達(dá)式drop將被看作是函數(shù)對象。因?yàn)閜rintln可以帶任何類型對象,這個代碼可以編譯通過,但產(chǎn)生出乎意料的結(jié)果。

為了避免這樣的情況,Scala需要你指定顯示省略的函數(shù)參數(shù),盡管標(biāo)志簡單到僅用一個‘_’。Scala允許你僅在需要函數(shù)類型的地方才能省略這個僅用的_。

【相關(guān)閱讀】

  1. Scala:函數(shù)文本的短格式和占位符語法
  2. 介紹Scala的***類函數(shù)
  3. Scala的本地函數(shù):將私有方法轉(zhuǎn)換為本地方法
  4. Scala中定義函數(shù)的方法:method
  5. 繼續(xù)領(lǐng)悟函數(shù)式:Scala指令式風(fēng)格代碼的重構(gòu)

責(zé)任編輯:book05 來源: Artima
相關(guān)推薦

2017-03-07 15:13:28

Scala偏函數(shù)函數(shù)

2013-04-16 10:24:33

函數(shù)偏函數(shù)編程語言

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-12-11 10:44:00

Scala講座函數(shù) scala

2009-07-21 17:21:57

Scala定義函數(shù)

2010-01-28 14:51:24

Scala后函數(shù)式

2010-03-11 10:34:22

Scala

2009-07-08 12:43:59

Scala ServlScala語言

2009-06-16 17:09:17

Scala面向?qū)ο?/a>函數(shù)編程

2009-07-21 17:29:25

Scala第一類函數(shù)

2020-10-31 17:33:18

Scala語言函數(shù)

2009-12-11 10:42:00

Scala講座類定義構(gòu)造函數(shù)

2010-09-14 15:34:41

Scala

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2009-07-22 07:41:00

Scala函數(shù)文本占位符語法

2009-07-08 16:10:24

Scala簡介面向?qū)ο?/a>函數(shù)式

2012-06-08 09:28:15

EclipseScalaAndroid

2014-01-07 10:12:15

Spark

2009-07-09 00:25:00

Scala函數(shù)式

2009-12-11 10:43:00

Scala講座操作符函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

另类的小说在线视频另类成人小视频在线| 秋霞蜜臀av久久电影网免费| 亚洲精品视频在线| 精品久久久久久乱码天堂| 欧美 日韩 精品| 久久一本综合| 国产在线看一区| 九九视频直播综合网| 亚洲天堂av网站| 成人精品国产亚洲| 亚洲成国产人片在线观看| 色播亚洲婷婷| 日本高清视频免费观看| 男女性色大片免费观看一区二区 | 欧美色视频免费| 久久电影网站中文字幕| 69av在线视频| 欧美国产日韩在线观看成人| 亚洲aaa级| 亚洲国产日韩av| 亚洲综合第一| 青青九九免费视频在线| 懂色av中文字幕一区二区三区| 国产成人精品综合| 天堂资源在线播放| 在线免费观看日本欧美爱情大片| 亚洲男人天堂古典| 蜜臀aⅴ国产精品久久久国产老师| 成人精品国产| 色伊人久久综合中文字幕| 国产尤物av一区二区三区| av在线第一页| 国产色一区二区| 精品在线视频一区二区三区| 亚洲a视频在线| 国产在线视频一区二区三区| 国产精品久久综合av爱欲tv| 国产一级片免费| 欧美在线高清| 久久精彩免费视频| 久久久精品成人| 国产精品一在线观看| 亚洲激情 国产| 黄色免费视频网站| 超碰一区二区三区| 欧美精品一区二区三区四区| 亚洲av综合色区无码另类小说| 久久综合偷偷噜噜噜色| 欧美一区二区三区免费大片| 91看片破解版| 国模大尺度视频一区二区| 欧美日本一区二区| 日韩欧美国产片| 四虎国产精品免费久久5151| 欧美喷潮久久久xxxxx| 91极品尤物在线播放国产| av成人免费看| 在线观看91精品国产麻豆| 做a视频在线观看| 亚洲男人在线| 日韩欧美在线综合网| 亚洲精品鲁一鲁一区二区三区| 久久69av| 亚洲成人在线网| www.色多多| 欧美三级美国一级| 日韩一区二区在线视频| 久久免费看少妇高潮v片特黄 | 中文字幕精品av| 人成免费在线视频| 外国成人激情视频| 欧美黑人狂野猛交老妇| 在线观看 中文字幕| 噜噜噜在线观看免费视频日韩 | 欧美成aaa人片免费看| 欧美日韩在线视频免费播放| 一本色道88久久加勒比精品| 日本久久久久久久| 91国产免费视频| 国产91对白在线观看九色| 蜜桃成人在线| 丝袜美腿美女被狂躁在线观看| 亚洲欧美日韩久久| 免费 成 人 黄 色| 福利一区视频| 欧美videossexotv100| 91精彩刺激对白露脸偷拍| 91视频综合| 久久免费视频这里只有精品| 免费黄色av片| 综合久久精品| 欧美在线视频一区| 国产精品一级二级| 久久综合av免费| 国产又粗又爽又黄的视频| 538视频在线| 欧美年轻男男videosbes| www.男人天堂| 97国产成人高清在线观看| 午夜精品久久久99热福利| 黄色污污视频软件| 成人免费观看男女羞羞视频| 日本一区免费在线观看| 四虎亚洲成人| 欧美美女直播网站| 免费在线观看成年人视频| 911精品美国片911久久久| 欧美诱惑福利视频| 亚洲第一色视频| 国产精品电影一区二区三区| 国产h视频在线播放| **欧美日韩在线| 夜夜嗨av一区二区三区四区| 国产一级片网址| 国产美女娇喘av呻吟久久| 日本不卡一区二区三区视频| 丰满大乳少妇在线观看网站| 欧美精品在线一区二区三区| 91成年人网站| 国产日韩欧美三级| 国产精品久久久久免费| 国内精品不卡| 欧美日韩亚洲综合在线| 日韩乱码人妻无码中文字幕久久| 亚洲高清不卡| 国产精华一区| h片在线免费观看| 欧美日韩你懂得| 日韩免费成人av| 日韩精品1区2区3区| 久久艳妇乳肉豪妇荡乳av| 9999在线视频| 精品国产99国产精品| 欧美成人三级在线观看| 久久成人精品无人区| 日本精品一区二区| 色尼玛亚洲综合影院| 色婷婷国产精品| 精品久久久久久无码人妻| 亚洲综合中文| 91久久国产综合久久91精品网站| 五月天婷婷在线视频| 欧美亚洲一区二区在线观看| 亚洲区自拍偷拍| 久久av最新网址| 欧美精品一区三区在线观看| 91av亚洲| 在线视频欧美日韩精品| 亚洲在线免费观看视频| 国产精品狼人久久影院观看方式| www.超碰com| 日本在线电影一区二区三区| 国产精品免费小视频| 天堂中文8资源在线8| 欧美一区二区三区视频免费播放| 日韩欧美中文字幕视频| 国产白丝网站精品污在线入口| 日韩欧美视频免费在线观看| 国产三级精品三级在线观看国产| 国外成人性视频| 全部免费毛片在线播放网站| 在线视频中文字幕一区二区| 成人三级视频在线观看| 国产一区二区三区四| 日韩国产成人无码av毛片| 精品中国亚洲| 97超级碰碰人国产在线观看| 黄网站在线观看| 欧美高清精品3d| 免费一级全黄少妇性色生活片| www.av亚洲| 中文字幕在线观看一区二区三区| 日韩一区二区三区四区五区| 欧美尺度大的性做爰视频| 男人天堂综合网| 一本高清dvd不卡在线观看| 91视频免费在观看| 国产成人午夜精品5599| 欧美精品99久久| 日韩精品二区| 国产美女在线精品免费观看| 老司机2019福利精品视频导航| 日韩专区中文字幕| 东京干手机福利视频| 日韩欧美精品网站| 国产精品91av| 久久一区激情| 亚洲自拍偷拍一区二区三区| 欧美成人专区| 成人高h视频在线| 女人让男人操自己视频在线观看| 中文字幕日韩av| 天堂成人在线视频| 欧美精品日日鲁夜夜添| 亚欧视频在线观看| 亚洲欧洲在线观看av| 在线免费观看污视频| 精彩视频一区二区| jizzjizzxxxx| 欧美日本一区二区高清播放视频| 日本一区二区三区四区高清视频 | 国产一区二区三区四| 欧美日韩在线中文| 欧美国产91| 日韩精品不卡| 日韩大胆成人| 成人在线免费网站| 欧美三级电影网址| 5278欧美一区二区三区| 18av在线播放| 日韩在线免费视频观看| 日韩私人影院| 亚洲国产精品国自产拍av秋霞| 亚洲专区第一页| 色哟哟精品一区| 国产手机在线视频| 亚洲精品久久7777| 成人黄色短视频| 久久无码av三级| 午夜不卡久久精品无码免费| 精品一区二区免费| 激情五月亚洲色图| 国产精品视频| 少妇人妻无码专区视频| 欧美另类综合| 成年人视频大全| 久久久久午夜电影| 亚洲在线色站| 色综合五月天| 亚洲高清视频在线观看| 亚洲精品亚洲人成在线| 精品视频一区二区三区四区| swag国产精品一区二区| 91视频最新| 国产精品亚洲欧美一级在线| 成人在线视频网站| 国产高清亚洲| 91国产在线播放| 九色精品蝌蚪| 国产福利久久精品| 中文字幕区一区二区三| 91观看网站| 大奶在线精品| 国产伦精品一区二区三区视频黑人| 亚洲国产中文在线二区三区免| 亚洲在线视频观看| 试看120秒一区二区三区| 99re在线视频上| 在线视频亚洲欧美中文| 国产视频99| 四虎884aa成人精品最新| 欧美日韩国产精品一卡| 你懂的视频欧美| 亚洲mv在线看| 亚洲国产不卡| 成人性生活视频免费看| 国产精品一国产精品k频道56| 成年人视频网站免费观看| 久久一区二区三区四区五区 | 开心久久婷婷综合中文字幕| 国产精品网址在线| 欧美在线在线| 久久国产精品久久精品国产| 亚洲人成精品久久久| 天堂av一区二区| 91精品国产麻豆国产在线观看| 久久久久亚洲av无码专区喷水| 欧美日韩网站| 国产成人在线免费看| 日韩激情视频网站| 成人av毛片在线观看| 成人一级视频在线观看| 欧美色图亚洲激情| 国产精品久久久久影院老司| 欧美精品久久久久性色| 疯狂做受xxxx高潮欧美日本 | 亚洲成人三级在线| 国产裸舞福利在线视频合集| 精品久久国产精品| www成人免费观看| 国产精品久久久久久搜索 | 免费在线观看一区二区三区| 超碰中文字幕在线观看| 波多野结衣中文字幕一区二区三区| 国产手机在线观看| 亚洲精品一二三| 亚洲免费黄色网址| 日韩一区二区三免费高清| 亚洲av毛片成人精品| 色噜噜狠狠狠综合曰曰曰| 97天天综合网| 成人免费在线视频网站| 农村少妇一区二区三区四区五区| 亚洲日本理论电影| 亚洲深夜av| 黄色一级片免费播放| 久久伊人蜜桃av一区二区| 99久久婷婷国产综合| 色婷婷av一区二区三区大白胸 | 粉嫩久久99精品久久久久久夜| www.av天天| 亚洲成人免费在线| 国产精品久久久久久久久久久久久久久久久久 | 人成在线免费网站| 亚洲综合社区网| 欧美中文一区二区| 日本三级免费网站| 处破女av一区二区| 日韩av手机在线免费观看| 色婷婷激情一区二区三区| 日韩一级片免费观看| 欧美成人免费小视频| 国产精品伦一区二区| 蜜桃网站成人| 国产精品视区| 男人添女人荫蒂国产| 中文字幕中文字幕在线一区 | 天天综合五月天| 青青草原综合久久大伊人精品优势| 人妻互换一二三区激情视频| 日韩毛片一二三区| 亚洲一区二区人妻| 亚洲视频综合网| 刘亦菲一区二区三区免费看| 国产一区二区三区av在线| 欧美激情在线| 五月天六月丁香| 亚洲欧美日韩精品久久久久| 一级做a爱片久久毛片| 在线免费看av不卡| 小黄鸭精品aⅴ导航网站入口| 国产在线精品一区二区三区》| 欧美另类视频| 秘密基地免费观看完整版中文| 亚洲女与黑人做爰| 99精品在线视频观看| 久久久97精品| 国产亚洲精aa在线看| 在线观看17c| 国产成+人+日韩+欧美+亚洲| 久久久精品国产sm调教| 日韩免费观看高清完整版在线观看| www在线免费观看视频| 亚洲伊人一本大道中文字幕| 91精品久久久久久久蜜月| 久久成年人网站| 亚洲免费看黄网站| 99热这里只有精品在线| 欧美精品免费在线| 91亚洲精品视频在线观看| 丁香六月激情婷婷| www.一区二区| 91video| 国产一区二区三区丝袜| 日韩高清在线| 先锋影音男人资源| 高清不卡一二三区| 精品欧美一区二区三区免费观看| 日韩精品在线观看网站| 欧美羞羞视频| 伊人久久大香线蕉成人综合网 | 国产网站无遮挡| 日本道色综合久久| 免费观看在线黄色网| 99久久免费国| 亚洲欧美成人综合| 青青草自拍偷拍| 日韩欧美国产一二三区| 草草视频在线观看| 日韩欧美视频第二区| 国产一级精品在线| 影音先锋亚洲天堂| 国产亚洲欧洲高清一区| 国产激情综合| 欧美日韩在线视频一区二区三区| 欧美国产97人人爽人人喊| 国产乱淫a∨片免费观看| 久久久久久九九九| 国产精品最新| 日本亚洲一区二区三区| 欧美日韩国产综合视频在线观看中文| 国产www.大片在线| 99久久精品无码一区二区毛片| 午夜在线a亚洲v天堂网2018| 992在线观看| 亚洲护士老师的毛茸茸最新章节| **欧美日韩在线观看| 国产亚洲精品久久久久久久| 久久综合九色综合97婷婷| 一区二区不卡视频在线观看| 国a精品视频大全| 久久影院100000精品| 西西大胆午夜视频| 91麻豆精品国产91久久久更新时间| 国产va在线视频| 日日噜噜夜夜狠狠久久丁香五月| 久久综合给合久久狠狠狠97色69| 国产色片在线观看| 国产精品高潮视频| 99精品国产99久久久久久福利|