java函數語言程式設計-科裡化
什麼是函式?
在數學上,函式的定義為“它接受零個或多個引數,生成一個或多個結果”
而在java8中,函式的定義為像數學函式一樣沒有副作用的函式
複製程式碼
什麼是副作用?
如果一個方法既不修改它內嵌類的狀態,也不修改其他物件的狀態,
使用return返回所有的計算結果, 那麼我們稱其為純粹的或者無副作用的。
簡單點說,如果一個方法在執行的時候修改了另一個物件的資料,導致兩次同樣的輸入返回不同的結果
那麼這個方法就是存在副作用。
複製程式碼
科裡化
它是一種可以幫助你模組化函式,提高程式碼重用性的技術
複製程式碼
在給出科裡化定義前,我們先看一個例子:
應用程式通常會有國際化需求,將一套單位轉換到另一套單位是經常遇到的問題 單位轉換通常涉及到轉換因子和基線調整因子的問題,比如,將攝氏度轉到華氏度的公式是: CtoF(x) = x * 9/5 + 32; 所有的單位轉換幾乎都遵行下面這種模式: (1) 乘以轉換因子 (2) 如果需要,進行基線調整 你可以用下面的程式碼表示這一模式:
static double converter (double x, double f, double b) { return x * f + b; } 複製程式碼
這裡x是你希望轉換的引數,f是轉換因子,b是基線值。
上述程式碼雖然能得到我們希望的資料,但是有些過於寬泛了,通常,你還需要在同一類單位之間進行轉換,比如公里和英里。當然,我們也可以每次呼叫converter方法,同時傳入3個引數,但是這太繁瑣了,換一種說法,我們應該要向數學方向的函式看齊,也就是f(x)這樣的格式。因此,這裡就可以改成一個簡單的類似於工廠的模式,利用java8的新特性函式介面。
static DoubleUnaryOperator curriedConverter (double f, double b) {
return (double x) -> x * f + b;
}
複製程式碼
該方法通過傳入轉換因子和基線值返回一個函式。 現在,我們可以像數學函式一樣呼叫對應的方法了
DoubleUnaryOperator convertCtoF = curriedConverter (9.0/5, 32);
//由於DoubleUnaryOperator定義了方法applyAsDouble,你可以像下面一樣使用這個函式
double f = convertCtoF.applyAsDouble(37);
複製程式碼
這樣一來,你只需要在最開始的時候獲取對應的函式,之後就直接跟數學函式一樣使用就好了。 讓我們來總結一下上述步驟: 首先你並沒有每次傳遞3個引數。而是先傳入2個引數f和b來生成函式並返回。返回的方法會接收引數x,也就是我們希望進行轉換的值,最終返回x * f + b。通過這種方法,我們複用了現有的轉換邏輯,同時又為不同的轉換因子建立了不同的轉換方法
科裡化的定義
科裡化是一種將具備2個引數(比如x,y)的函式f轉化為使用一個引數的函式g,
並且這個函式的返回值也是一個函式,他會作為新函式的一個引數
後者的返回值和初始函式的返回值相同,即
f(x, y) = (g(x)) (y)
當然最終的解釋便是:他表示一種將一個帶有n元組引數的函式轉換成n個一元函式鏈的方法
這種概念最早由俄國數學家Moses Schönfinkel引入,
而後由著名的數理邏輯學家哈斯格爾·科裡(Haskell Curry)豐富和發展,科裡化由此得名。
複製程式碼
一個函式使用所有引數僅有部分被傳遞時,通常我們說這個函式是部分應用的(partially applied)。