curry翻譯為中文就是咖喱。意為使用curry可以讓代碼更有味道。 scala里的curry化可以把函數從接收多個參數轉換成接收多個參數列表。也就是說我們要編寫的函數不是只有一個參數列表,這個參數列表中有多個參數以逗號分隔;而是一個函數中有多個參數列表,每個參數列表中只有一個參數(當然,也可以有多... ...
curry翻譯為中文就是咖喱。意為使用curry可以讓代碼更有味道。
scala里的curry化可以把函數從接收多個參數轉換成接收多個參數列表。也就是說我們要編寫的函數不是只有一個參數列表,這個參數列表中有多個參數以逗號分隔;而是一個函數中有多個參數列表,每個參數列表中只有一個參數(當然,也可以有多個參數)。也就是說我們寫的函數不再只是這樣子的:
def foo(a: Int, b: Int, c: Int) {}
而是這樣子的:foo(1)(2)(3),或者這樣的:foo(1){2}{3},甚至是這樣子的:foo{1}{2}{3}。
來看一下定義成多個參數列表的方法到底是什麼樣的。這次使用scala互動式shell會話:
按照上面所說我們定義了一個函數foo()。然後,調用foo_創建了一個偏應用函數,也就是說,這個函數有一個或多個參數未綁定。關於偏應用函數稍後會詳細說,這次主要關註互動式shell提供的消息:先是三個一連串的轉換,鏈中的每個函數都接收一個Int,返回一個偏應用函數。不過,最後一個的結果是Unit。
現在可以使用curry化的形式重寫一下inject方法:
def inject(arr: Array[Int], initial: Int)(operation: (Int, Int) => Int): Int = { var carryOver = initial arr.foreach(element => carryOver = operation(carryOver, element)) carryOver }
這樣一來,我們就不必在一個參數列表裡用逗號分割的形式傳遞參數了。現在可以使用圓括弧或花括弧獨立傳遞參數了:
val array = Array(2, 3, 5, 1, 6, 4) val sum = inject(array, array(0)){ (carryOver, elem) => Math.max(carryOver, elem) } println("Max of elements in array [" + array.mkString(",") + "] is " + sum)
是不是看起來更優雅了——雖然剛見到的時候理解有些困難,但是熟悉了這種語法後還是能體會到它的好處的。
########