函數(shù)式中的 currying
currying 是函數(shù)式語言中經(jīng)常遇到的一個概念,翻譯成 柯里化,不是庫里化。
currying 指的是將接收多個參數(shù)的函數(shù)變換成接收一個單一參數(shù),并且返回接收余下的參數(shù)而且返回結果的新函數(shù)的技術。
說起來比較拗口,直接看下面的代碼。
def add(x: Int, y: Int): Int = x + y //call add add(1, 2) add(3, 4)
但是如果我們使用 currying 的寫法,那么可以將兩個參數(shù)分開,接收第一個參數(shù)(x),然后返回一個函數(shù),這個函數(shù)以第二個參數(shù)(y)為參數(shù),返回結果:
def add(x:Int) => (y: Int) = x + y
然后我們就可以這樣調(diào)用 add 了。
add(1)(2) add(3)(4)
scala 對于這種寫法提供了語法糖,add 的 currying 寫法我們可以更簡單地寫為:
def add(x: Int)(y: Int): Int = x + y
嘗試將一個函數(shù)(這里指f)寫成 curry 方式:
def curry[A, B, C](f: (A, B) => C): A => (B => C) = a => b => f(a, b)
這里的 currying 函數(shù),它接收兩個參數(shù),分別為 A 類型和 B 類型,然后返回一個 C 類型的結果。那么我們可以通過得到一個偏函數(shù)將其轉化為 curry 的方式,即 A => (B => C)。具體流程是,用第一個參數(shù) a ,得到一個函數(shù),這個函數(shù)使用 b 作為參數(shù),然后得到結果。這里中間的這個函數(shù),是一個偏函數(shù)。
同樣我們也可以寫一個 uncurry 的方法(即將 currying 的函數(shù)f轉化成非 currying 的):
def uncurry[A, B, C](f: A => B => C): (A, B) =>&