#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,參數有兩個:

  1. 第一個參數是Lambda表達式,op: Double => Double,其傳入一個Double類型參數,返回值也是Double類型;

  2. 第二個參數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?

TAG:Scala | 函数式编程 |