學習筆記01·柯里化精準計算

周末折騰代碼的時候發現一個精準計算的東東,

所謂精準計算有什麼用呢?

代碼:

function createMathOperation(operator) { return (value, other) => { let result; if (value === undefined && other === undefined) { return 0; } if (value !== undefined) { result = value; } if (other !== undefined) { if (result === undefined) { return other; } if (typeof value === string || typeof other === string) { value = baseToString(value); other = baseToString(other); } else { value = baseToNumber(value); other = baseToNumber(other); } result = operator(value, other); } return result; };}

大意是把計算是各個值在不同情況下的轉化,如果正常情況下執行:

1 + 10 // 110

這時結果明顯不符合我們的期望,通過上面的 createMathOperation:

powerAdd = createMathOperation((x, y) => {return x + y})powerAdd(1, 10) // 11

這樣就可以避免這種110的尷尬了??

但有個小問題,如果是多個數以上相加處理就略顯尷尬了:

1 + 2 + 3: powerAdd(powerAdd(1, 2), 3)1 + ... + n : powerAdd(powerAdd(powerAdd(..., ...n-2), n-1), n)

看著就被動,說好的powerAdd呢?說好的power呢??

第一步,在 createMathOperation 的基礎上加點柯里化改造:

function curryMathOperation(operator) { return function(x) { return function(x, y) { let result; if (x === undefined && y === undefined) { return 0; } if (x !== undefined) { result = x; } if (y !== undefined) { if (result === undefined) { return y; } if (typeof x === string || typeof y === string) { x = baseToString(x); y = baseToString(y); } else { x = baseToNumber(x); y = baseToNumber(y); } result = operator(x, y); } if (y === void 0) { return result; } else { return arguments.callee.bind(this, result); } }.bind(this, x) }}powerAdd = curryMathOperation((x + y) => { return x + Y });

這樣,多個參數相加就可以用

1 + 2 + ... + n: powerAdd(1)(2)(3)...(n)() // (1+n)n/2

這樣進一步還可以改造成

bossAdd = (function(powerAdd) { return function() { var result, args = Array.prototype.slice.call(arguments); for(var i = 0; i < args.length; i++) { result = result ? result(args[i]) : powerAdd(args[i]); } return result(); }})(powerAdd)

1 + 2 + ... + n: bossAdd(1, 2, ..., n)

這時,聰明的你估計會發現一個套路:

都是同一個套路,何不把它抽成一個函數?。。。好吧,在星爸爸里寫入神把別人的星冰樂喝里,喝的時候還以為前台妹子受到我唏噓滄桑成熟風範的迷惑偷偷在咖啡里加了料。。。下次再解密吧,先去賠禮道歉了??
推薦閱讀:

前端日刊-2018.01.08
前端日刊-2017.11.13
前端日刊-2017.12.19
Chrome上使用PWA

TAG:前端開發 | 前端工程師 |