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