JavaScript 可配置函数与柯里化
来源:互联网 发布:淘宝可以买限定皮肤吗 编辑:程序博客网 时间:2024/06/09 09:29
有时候你可能会写出这样的函数:
function foo(n, flag){ var ret = 1; if(flag) for(var i = 1; i <= n; i++) ret *= i; ret += n; if(flag) ret /= n; return ret;}
也许情况比这个更复杂,总之你希望用一个参数来控制程序流,这相当于你有一个配置函数的需求。
为什么不试试柯里化呢:
function foo(flag){ return function(n){ var ret = 1; if(flag) for(var i = 1; i <= n; i++) ret *= i; ret += n; if(flag) ret /= n; return ret; };}foo(true)(5); // 25foo(false)(5); // 6
这个时候你就可以简单地取一个函数别名了:
var foo1 = foo(true);var foo2 = foo(false);foo1(5); // 25foo2(5); // 6
这样就做到了函数的配置。
相比另外一种方案:
function foo(n, flag){ var ret = 1; if(flag) for(var i = 1; i <= n; i++) ret *= i; ret += n; if(flag) ret /= n; return ret;}function foo1(n) { return foo(true, n);}function foo2(n) { return foo(false, n);}
最终效果是相同的,但后者没有将函数作为参数的做法是不符合函数式编程范式的。
上一篇博文中描述的One Line DFT也有柯里化的写法:
// recursive DFTrecursiveDFT = (inverse) => (a) => a.length == 1 ? a : flatten(transpose(transpose(a.reduce((pre, cur, i) => pre[i & 1].push(cur) && pre, [[], []]).map(v => recursiveDFT()(v))).map((v, i) => [complex.add(v[0], complex.mul(complex.fromAngle(i * (inverse ? -2 * Math.PI / a.length : 2 * Math.PI / a.length)), v[1])), complex.minus(v[0], complex.mul(complex.fromAngle(i * (inverse ? -2 * Math.PI / a.length : 2 * Math.PI / a.length)), v[1]))]))).map(v => inverse ? complex.numMul(1 / a.length, v) : v);
DFT = recursiveDFT(false);inverseDFT = recursiveDFT(true);var arr = [complex(3), complex(4), complex(0), complex(0)]var rarr = DFT(arr); inverseDFT(rarr); // almost equals to arr
这样就封装了两个子函数,看起来比较优雅。
0 0
- JavaScript 可配置函数与柯里化
- JavaScript-可维护代码编写,函数式编程与纯函数
- Javascript偏函数与柯里化
- 函数可重入与可重载
- javascript编程技巧_可配置化
- JavaScript属性的可迭代、可修改和可配置特性
- 可冲入函数与多线程安全函数
- JavaScript之函数绑定与函数柯里化(高级函数)
- javascript 函数与对象
- javascript函数与对象
- javascript函数与事件
- javaScript对象与函数
- Javascript 对象与函数
- JavaScript函数与数组
- javascript函数与对象
- JavaScript函数与方法
- JavaScript函数与对象
- C#函数与JavaScript函数
- JavaScript DFT 离散傅里叶变换
- 运行WordCount程序
- Android Studio主题设置、颜色背景配置
- SoapUI实现Import Groovy功能
- 二分_Mode(2016swust校赛)
- JavaScript 可配置函数与柯里化
- Reverse Vowels of a String
- 暴力____Football(2016swust校赛)
- 字典树+DFS____字符矩阵(2015swust院赛)
- 坚刚不可夺其志
- Palindrome Permutation
- C#之四十四 滑铁卢战役
- SpringMVC之安全性(一)
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)