函數(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) =>&
        
		

網(wǎng)友評(píng)論