精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

97视频在线观看亚洲| 日韩精品最新网址| 亚洲综合五月天| 国产又粗又黄又爽的视频| 成人av福利| 国产乱一区二区| 性欧美xxxx交| 日韩精品电影一区二区三区| 国产精品视频一区视频二区| 亚洲电影第三页| 日韩区国产区| 高h震动喷水双性1v1| 免费国产自线拍一欧美视频| 日韩性生活视频| 亚洲av永久无码精品| 日本网站在线免费观看视频| 亚洲图片小说视频| 国产区美女在线| 久久久久久久久久久电影| 国产自产女人91一区在线观看| 成人免费看片98| 国产精品亚洲人成在99www| 欧美一区二区不卡视频| 午夜精品久久久内射近拍高清| 中文国产字幕在线观看| 久久精品一区二区三区av| 1卡2卡3卡精品视频| 69视频免费看| 欧美爱爱网站| 欧美高清你懂得| 精品一区二区中文字幕| 羞羞视频在线免费国产| 国产麻豆成人精品| 国产成人一区二区| 国产一级一片免费播放放a| 欧美激情777| 亚洲性视频网址| 黄色片视频在线播放| 欧美6一10sex性hd| 亚洲欧美日韩国产一区二区三区| 精品人伦一区二区三区 | 一本色道久久加勒比精品| 好吊妞www.84com只有这里才有精品 | 久久精品影视| 青青国产91久久久久久| 九九视频直播综合网| 亚洲一区电影在线观看| 国产欧美日韩精品高清二区综合区| 亚洲第一区第二区| 国产精品久久中文字幕| av网址在线播放| 中文字幕日本乱码精品影院| 亚洲国产欧美日韩| 国产一区二区在线播放视频| 日韩精品欧美精品| 国产成人一区三区| 无码人妻一区二区三区线| 蘑菇福利视频一区播放| 欧洲日本亚洲国产区| 快灬快灬一下爽蜜桃在线观看| 伊人成综合网yiren22| 亚洲精品久久久久久久久久久久久 | 三级全黄做爰视频| 99久久久久| 欧美不卡在线视频| 中文字幕人妻无码系列第三区| 成人污污视频| 欧美xxx久久| 在线xxxxx| 精品久久ai电影| 亚洲精品在线观看www| 五月天av在线播放| 少妇高潮一区二区三区99| 欧美日韩不卡在线| 亚洲一区二区三区四区精品| 亚洲综合影院| 欧美视频中文字幕| 一区二区三区欧美精品| 免费观看亚洲天堂| 亚洲国产精品久久久久| 亚洲自拍偷拍一区二区| sdde在线播放一区二区| 少妇高潮 亚洲精品| 欧美激情精品久久久久久免费| 欧美在线免费一级片| 97热精品视频官网| 国产情侣免费视频| 国产一本一道久久香蕉| 精品国产aⅴ麻豆| av在线二区| 伊人性伊人情综合网| 婷婷五月综合缴情在线视频| 美女高潮视频在线看| 亚洲女爱视频在线| av高清在线免费观看| 巨胸喷奶水www久久久免费动漫| 6080日韩午夜伦伦午夜伦| 欧洲熟妇的性久久久久久| 免费av一区二区三区四区| 久久久成人精品| www日韩精品| 蜜桃视频第一区免费观看| 国产91视觉| 成人免费视频| 午夜精品久久久久久久久久久 | 中国字幕a在线看韩国电影| 亚洲婷婷综合久久一本伊一区| 亚洲国产一二三精品无码| 345成人影院| 日韩一级黄色片| 欧美黄色一级生活片| 黄色精品网站| 成人精品久久一区二区三区| 亚洲av成人无码久久精品老人| 中文字幕制服丝袜成人av | 日本一区二区高清视频| 日本在线视频网址| 欧美亚洲国产bt| 国产高清成人久久| 亚洲欧洲美洲一区二区三区| 欧美最顶级的aⅴ艳星| 国内精品久久久久久久久久久| 蜜桃在线一区二区三区| 好吊色欧美一区二区三区| 香蕉久久aⅴ一区二区三区| 在线免费亚洲电影| 在线免费观看污视频| 欧美极品一区二区三区| 国产精品网红福利| 美国一级片在线免费观看视频| 亚洲另类在线一区| 中文字幕一区久久| 日韩精品一区二区三区免费观看| 欧美亚洲成人精品| 姝姝窝人体www聚色窝| av高清不卡在线| 国外成人在线视频网站| 黄色网在线免费观看| 日本高清无吗v一区| 网站一区二区三区| 九色精品91| 97在线日本国产| 免费看黄色一级视频| 亚洲在线观看免费| 手机看片国产精品| 中文字幕日韩欧美精品高清在线| 国产精品亚发布| www黄在线观看| 欧美影院精品一区| 91视频免费看片| 美女爽到高潮91| 一个色的综合| 国产欧美88| 久久夜色精品亚洲噜噜国产mv| 国产精品一级视频| 亚洲欧美一区二区不卡| a级大片免费看| 欧美一区激情| 高清国产在线一区| 国模雨婷捆绑高清在线| 亚洲第一区第二区| 成人毛片在线播放| 国产日产欧美一区二区视频| 天天碰免费视频| 欧美丝袜一区| 国模吧一区二区| 香蕉视频国产在线| 色综合天天综合网国产成人综合天 | 日日骚欧美日韩| 欧美日韩精品中文字幕一区二区| 综合久久2023| 亚洲午夜女主播在线直播| 波多野结衣一本一道| 国产精品私人影院| 国产九九九视频| 最新国产拍偷乱拍精品| 精品一区久久| 成人国产一区| 欧美成人在线直播| 国产无码精品视频| 久久亚洲一区二区三区明星换脸 | 国产精品自拍毛片| 国内少妇毛片视频| 国产不卡av一区二区| 国产欧美日韩专区发布| 在线视频国产区| 亚洲精品美女久久| 在线观看一二三区| 亚洲精品成人悠悠色影视| 国产伦精品一区二区免费| 天堂午夜影视日韩欧美一区二区| 中文字幕欧美人与畜| 欧亚精品一区| 国产日韩欧美视频在线| 国产在线观看www| 中文字幕国产精品| 日日骚av一区二区| 中文字幕色av一区二区三区| 国产艳妇疯狂做爰视频 | 国产精品mp4| fc2ppv国产精品久久| 日韩va亚洲va欧洲va国产| 在线观看黄色国产| 午夜精品福利视频网站| 91大神福利视频| 波多野结衣啪啪| 国产欧美91| 亚洲三区四区| 欧美尿孔扩张虐视频| 国产日韩精品入口| 超碰激情在线| 久久久999成人| 加勒比一区二区三区在线| 亚洲伊人色欲综合网| 一本加勒比北条麻妃| 国产激情精品久久久第一区二区| 亚洲人成色77777| 激情六月综合| 欧美性受黑人性爽| 青青草成人影院| 久久99精品久久久久久水蜜桃| 久久的色偷偷| 国产精品视频精品| 丝袜美腿一区| 97视频在线观看免费| 色网在线观看| 日韩视频在线一区| av基地在线| 亚洲视频电影图片偷拍一区| 污污视频在线观看网站| 日韩免费性生活视频播放| 一级黄色免费片| 欧美影视一区二区三区| 亚洲乱码国产乱码精品| 精品久久久一区| 亚洲精品午夜久久久久久久| 亚洲男人的天堂在线观看| 亚洲a∨无码无在线观看| 久久精品视频在线看| 97人妻精品一区二区三区免 | 亚洲の无码国产の无码步美| 国产成人高清在线| 国产曰肥老太婆无遮挡| 欧美91在线| 国产精品传媒毛片三区| 97青娱国产盛宴精品视频| 亚洲一区二区三区视频| 四虎精品一区二区免费| 91精品久久久久久久久久另类 | 国产高清在线一区| 一区二区中文字幕在线观看| 99精彩视频| 超碰一区二区三区| 国产一区二区三区高清| 久久中文资源| 麻豆蜜桃91| 国产精品免费不| 涩涩涩999| 91蜜臀精品国产自偷在线| 在线综合视频网站| 欧美va天堂| 妺妺窝人体色777777| 国产一区二区三区成人欧美日韩在线观看| 欧美成人免费在线观看视频| 99riav国产精品| 免费观看成人网| 裸体一区二区三区| 熟妇无码乱子成人精品| 成人aa视频在线观看| 丰满少妇一区二区三区| 国产喷白浆一区二区三区| 战狼4完整免费观看在线播放版| 国产精品久久久久久久久久免费看| 艳妇荡乳欲伦69影片| 亚洲一区二区三区四区的| 日韩在线视频免费播放| 在线精品国精品国产尤物884a| 一区二区三区播放| 日韩精品一区二区三区中文精品| 少妇高潮一区二区三区69| 亚洲欧美中文在线视频| 免费不卡视频| 欧美激情一区二区久久久| 最新欧美色图| 91九色国产视频| 欧美gv在线| 国产精品久久久av| 日本免费精品| 久久精品国产一区二区三区日韩 | 少妇一级淫片日本| 日韩一区二区三区在线视频| 亚洲aaa在线观看| 久久精品视频在线观看| 蜜桃av在线播放| 国产精品综合久久久| 成人在线tv视频| 秋霞毛片久久久久久久久| 国产精品毛片一区二区在线看| 你真棒插曲来救救我在线观看| 日韩精品福利网| 免费啪视频在线观看| 欧美激情中文字幕一区二区| 久久精品国产亚洲AV无码男同| 色久综合一二码| www.蜜臀av.com| 一区二区三区在线播放欧美| 久久五月精品中文字幕| 国产精品免费久久久久影院| 国产亚洲精品美女久久| 亚洲欧美日韩精品在线| 人妻无码中文字幕| 国产亚洲一区二区三区| 亚洲怡红院在线观看| 色综合天天视频在线观看 | 精品日韩av一区二区| 自拍视频在线| 人九九综合九九宗合| 96sao在线精品免费视频| 亚洲乱码一区二区三区| 久久动漫亚洲| 亚洲成年人av| 亚洲日本一区二区| 国产精品第六页| 亚洲精品中文字幕av| 国产蜜臀av在线播放| 成人免费在线网址| 日韩欧美在线中字| 乱子伦视频在线看| 91麻豆精品在线观看| 欧美人妻精品一区二区免费看| 亚洲欧美一区二区在线观看| 色屁屁影院www国产高清麻豆| 精品欧美乱码久久久久久1区2区| 日本福利在线| 国产97在线|日韩| 小说区图片区色综合区| 老太脱裤让老头玩ⅹxxxx| 国产成都精品91一区二区三| 五月综合色婷婷| 欧美日韩成人在线| 在线a免费看| 国产精品一区久久| 日韩成人综合| av网站在线不卡| 中文文精品字幕一区二区| 无码人妻熟妇av又粗又大| 国产亚洲精品久久久久久牛牛| 欧美大片免费| 日本日本精品二区免费| 日韩av在线免费观看不卡| 国产全是老熟女太爽了| 一本大道久久a久久综合婷婷| 视频福利在线| 亲爱的老师9免费观看全集电视剧| 日韩av网址大全| 黑森林福利视频导航| 国产欧美精品在线观看| 中文字幕网址在线| 日韩中文字幕国产| 国产免费区一区二区三视频免费| 性生活免费观看视频| 国产福利一区二区三区视频在线| 久草视频免费播放| 成人情趣视频| 伊人久久大香线蕉av一区| 精品一区二区av| 久久久久久久久99| 亚洲国产精品小视频| 黄色在线观看www| 日本视频一区二区在线观看| 精品在线免费观看| 欧美人妻精品一区二区三区| 日韩av影视在线| 久久精品女人天堂av免费观看| 无码免费一区二区三区免费播放 | 在线观看成人免费视频| av在线播放av| 99久久99久久精品国产片| 亚洲国产免费看| 亚洲自拍偷拍图| 欧美一区二区三区四区在线观看| 98色花堂精品视频在线观看| 久久久久国产精品视频| 毛片一区二区三区| 久久免费视频精品| 亚洲日本欧美中文幕| www.久久草.com| 日本网站免费在线观看| 日本一区二区免费在线| 亚洲第一页视频| 国产成人精品电影| 欧美搞黄网站| 37p粉嫩大胆色噜噜噜| 欧美丰满嫩嫩电影| 日本乱码一区二区三区不卡| 亚洲激情啪啪| 成人ar影院免费观看视频| 亚洲天堂手机在线| 97国产一区二区精品久久呦| 欧美电影免费播放|