[转载] 纯函数和函数柯里化
參考鏈接: 用示例編寫Java柯里化Currying函數
文章目錄
?純函數什么是純函數純函數例子非純函數例子
? ?函數柯里化函數柯里化簡單例子參數復用
??
?
?
?
純函數?
什么是純函數?
?
?如果函數的調用參數相同,則永遠返回相同的結果。它不依賴于程序執行期間函數外部任何狀態或數據的變化,必須只依賴于其輸入參數。?
?該函數不會產生任何可觀察的副作用,例如網絡請求,輸入和輸出設備或數據突變(mutation)。?
?
這就是純的函數。 如果一個函數符合上述 2 個要求,它就是純函數。 你可能在過去甚至無意地情況下編寫過純函數。?
純函數例子?
function getSum(num) {
? ? return num * 2 + num
}
?
它符合我們所說的兩條純函數的定義。不依賴于任何外部輸入,不改變任何外部數據、沒有副作用。 即使你用同樣的輸入運行運行這個函數 100,000,000 次它依舊產生同樣的結果。?
非純函數例子?
let num = 10;
function getSum(num2) {
? ? return num + num2
}
?
在這里函數的計算結果取決于外部num變量,而非函數不能依賴外部任何變量,所以它就是非純函數?
函數柯里化?
?
?把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數而且返回結果的新函數的技術。?
?
函數柯里化簡單例子?
// 普通的add函數
function add(x, y) {
? ? return x + y
}
?
// Currying后
function curryingAdd(x) {
? ? return function (y) {
? ? ? ? return x + y
? ? }
}
?
add(1, 2)? ? ? ? ? ?// 3
curryingAdd(1)(2)? ?// 3
?
參數復用?
// 正常正則驗證字符串 reg.test(txt)
?
// 函數封裝后
function check(reg, txt) {
? ? return reg.test(txt)
}
?
check(/\d+/g, 'test')? ? ? ?//false
check(/[a-z]+/g, 'test')? ? //true
?
// Currying后
function curryingCheck(reg) {
? ? return function(txt) {
? ? ? ? return reg.test(txt)
? ? }
}
?
var hasNumber = curryingCheck(/\d+/g)
var hasLetter = curryingCheck(/[a-z]+/g)
?
hasNumber('test1')? ? ? // true
hasNumber('testtest')? ?// false
hasLetter('21212')? ? ? // false
?
上面的示例是一個正則的校驗,正常來說直接調用check函數就可以了,但是如果我有很多地方都要校驗是否有數字,其實就是需要將第一個參數reg進行復用,這樣別的地方就能夠直接調用hasNumber,hasLetter等函數,讓參數能夠復用,調用起來也更方便。
總結
以上是生活随笔為你收集整理的[转载] 纯函数和函数柯里化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 硬盘繁忙,icinga2 借
- 下一篇: oracle基本的操作命令,oracle