03.Currying

Currying 這名稱是以發表技術人為命名, 在中文翻譯也僅直接音譯, 無中文字面上的意義, 此技術延伸你對 Closures(閉包)的後續應用技巧. - WisdomFish, Kuo


維基百科條目說明


在電腦科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(優先函數的第一個參數)的函數,並且返回接受餘下的參數而且返回結果的新函數的技術。Currying指的是把多個參數放進一個接受許多參數的函數, 形成一個新的函數接受餘下的參數。

這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry(哈斯凱爾·加里) 命名的,儘管它是 Moses SchönfinkelGottlob Frege 發明的。

在直覺上,柯里化聲稱「如果你固定某些參數,你將得到接受餘下參數的一個函數」。所以對於有兩個變數的函數(y, x),如果固定了 y = 2,則得到有一個變數的函數 2x。

在理論電腦科學中,Currying 提供了在簡單的理論模型中比如只接受一個單一參數的 lambda 演算 中研究帶有多個參數的函數的方式。


Currying 特性
curry化結合函數原型擴展的最基本的作用就是可以在一個函數的定義之後,但是在這個函數的執行之前來定義其部分參數並返回curry化之後的函數。引入閉包,其實並不僅限於綁定參數,還可以綁定函數的this對象



Examples


未進行 Currying
scala> def add(x: Int, y: Int) = x + y
add: (x: Int,y: Int)Int

scala> add(5,7)
res68: Int = 12

Currying (其實僅是 Closures 的應用方式之一)
scala> def add(x: Int) = (y: Int) => x + y
add: (x: Int)(Int) => Int

scala> add(5)(7)
res70: Int = 12
x 作為先行參數傳入 add 函數, 再調用 x 進入 y 函數計算後, 返回 Int.


Scala 對 Currying 所給的語法蜜糖, 對編譯器而言與上述內容相符
scala> def add(x: Int)(y: Int) = x + y
add: (x: Int)(y: Int)Int

scala> add(5)(7)
res69: Int = 12






部份套用函式(Partially applied function)



References


Comments