多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

scala教程

模式匹配與函數組合

閱讀 (2242)

模式匹配與函數組合

函數組合

讓我們創建兩個函數:

scala> def f(s: String) = "f(" + s + ")"
f: (String)java.lang.String

scala> def g(s: String) = "g(" + s + ")"
g: (String)java.lang.String

compose

compose 組合其他函數形成一個新的函數 f(g(x))

scala> val fComposeG = f _ compose g _
fComposeG: (String) => java.lang.String = <function>

scala> fComposeG("yay")
res0: java.lang.String = f(g(yay))

andThen

andThen 和 compose很像,但是調用順序是先調用第一個函數,然后調用第二個,即g(f(x))

scala> val fAndThenG = f _ andThen g _
fAndThenG: (String) => java.lang.String = <function>

scala> fAndThenG("yay")
res1: java.lang.String = g(f(yay))

柯里化 vs 偏應用

case 語句

那么究竟什么是 case 語句?

這是一個名為 PartialFunction 的函數的子類。

多個 case 語句的集合是什么?

他們是共同組合在一起的多個 PartialFunction。

理解 PartialFunction(偏函數)

對給定的輸入參數類型,函數可接受該類型的任何值。換句話說,一個(Int) => String的函數可以接收任意 Int 值,并返回一個字符串。

對給定的輸入參數類型,偏函數只能接受該類型的某些特定的值。一個定義為(Int) => String 的偏函數可能不能接受所有 Int 值為輸入。

isDefinedAt 是 PartialFunction 的一個方法,用來確定 PartialFunction 是否能接受一個給定的參數。

注意:偏函數 PartialFunction 和我們前面提到的部分應用函數是無關的。

參考 Effective Scala 對 [PartialFunction](http://twitter.github.com/effectivescala/ programming-Partial functions) 的意見。

scala> val one: PartialFunction[Int, String] = { case 1 => "one" }
one: PartialFunction[Int,String] = <function1>

scala> one.isDefinedAt(1)
res0: Boolean = true

scala> one.isDefinedAt(2)
res1: Boolean = false

您可以調用一個偏函數。

scala> one(1)
res2: String = one

PartialFunctions 可以使用 orElse 組成新的函數,得到的 PartialFunction 反映了是否對給定參數進行了定義。

scala> val two: PartialFunction[Int, String] = { case 2 => "two" }
two: PartialFunction[Int,String] = <function1>

scala> val three: PartialFunction[Int, String] = { case 3 => "three" }
three: PartialFunction[Int,String] = <function1>

scala> val wildcard: PartialFunction[Int, String] = { case _ => "something else" }
wildcard: PartialFunction[Int,String] = <function1>

scala> val partial = one orElse two orElse three orElse wildcard
partial: PartialFunction[Int,String] = <function1>

scala> partial(5)
res24: String = something else

scala> partial(3)
res25: String = three

scala> partial(2)
res26: String = two

scala> partial(1)
res27: String = one

scala> partial(0)
res28: String = something else

case 之謎

上周我們看到一些新奇的東西。我們在通常應該使用函數的地方看到了一個 case 語句。

scala> case class PhoneExt(name: String, ext: Int)
defined class PhoneExt

scala> val extensions = List(PhoneExt("steve", 100), PhoneExt("robey", 200))
extensions: List[PhoneExt] = List(PhoneExt(steve,100), PhoneExt(robey,200))

scala> extensions.filter { case PhoneExt(name, extension) => extension < 200 }
res0: List[PhoneExt] = List(PhoneExt(steve,100))

為什么這段代碼可以工作?

filter 使用一個函數。在這個例子中是一個謂詞函數(PhoneExt) => Boolean。

PartialFunction 是 Function 的子類型,所以 filter 也可以使用 PartialFunction!

關閉
程序員人生
主站蜘蛛池模板: 国产福利观看 | 午夜视频吧 | 亚洲在线视频播放 | 性欧美videos另类hd | 91精品国产一区二区三区左线 | 亚洲日本天堂 | 亚洲精品成人网久久久久久 | 国产91久久精品 | 国产成人精品福利站 | 99久久中文字幕伊人 | 琪琪在线观看影院 | 成人在线免费小视频 | 亚洲国产欧美精品 | 欧美 国产 小说 另类 | 欧美日韩一二三区 | 午夜视频观看 | 俺也操 | 国内国内在线精品视频 | 日本一区二区三 | 福利片91 | 美国私人vps一夜爽毛片免费 | free性欧美tube视频 | 日本在线不卡一区二区 | 国产成人午夜性a一级毛片 国产成人系列 | 久久精品欧美一区二区 | 国产精品久久久久久网站 | 亚洲国产欧美一区 | 99视频精品全部免费免费观 | 欧美色就色 | 日本特级全黄一级毛片 | 久久国产精品亚洲77777 | 91精品一区二区三区在线观看 | 边吃奶边操 | 免费福利网站 | 亚洲wu码| 亚洲天码中文字幕第一页 | 日韩伦理福利免费 | 国产欧美视频一区二区三区 | 国产在线观看不卡免费高清 | www色网站| 亚洲男女一区二区三区出奶水了 |