#Scala#一個函數的分析,以及生活路上
scala> def twice(op: Double => Double, x: Double) = op(op(x))twice: (op: Double => Double, x: Double)Doublescala> twice(_ + 1, 5)res0: Double = 7.0
乍一看這句代碼,有點暈乎的感覺。
好好分析一下,其實很簡單:
- 第一句定義了一個函數twice,參數有兩個:
- 第一個參數是Lambda表達式,op: Double => Double,其傳入一個Double類型參數,返回值也是Double類型;
- 第二個參數x也是Double類型。
函數體op(op(x))裡面一層的op(x)表明將上面的x參數傳給op Lambda表達式,也就是x: Double => Double;op(x)返回值是Double,姑且假設返回值是y;之後再次把這個y值傳給op Lambda表達式,即y: Double => Double。
- 對應到第二句,那就更具體了,就按上一句照翻(偽代碼):
函數體op(op(x))裡面一層的op(x)表明將x參數(5)傳給op Lambda表達式(這時具體的Lambda表達式就是:(_: Double) => _ + 1),也就是5.0: Double => _ + 1(整數5自動轉換成了Double類型;_是佔位符,在這裡代表x值5.0);op(x)返回值是5.0 + 1 = 6.0;之後再次把這個6.0(y值)傳給op Lambda表達式,即6.0: Double => _ + 1,最終計算並返回6.0 + 1 = 7.0。
不得不說,Scala確實複雜,語法糖比Ruby多多了......下班小路上,竟然發現花開滿地,正是不知不覺落花屬意啊,景美徑幽,愛技術愛生活。
推薦閱讀:
※scala 庫是如何做到並行的?
※為什麼 Scala 不建議用 return?
※國內有哪些 Scala 大牛?
※如何评价Functional Programming in Scala 这本书?
※如果對方是一個 Scala 愛好者,有什麼辦法說服他使用 Go?