Currying 及应用
|
Currying,中文多翻译为柯里化,感觉这个音译还没有达到类似 Humor 之于幽默的传神地步,后面直接使用 Currying。 什么是 CurryingCurrying 是这么一种机制,它将一个接收多个参数的函数,拆分成多个接收单个参数的函数。 考察下面的代码: function add (a, b) {
经过 curry 化处理后,函数成了如下形式: function add (a) {
现在 add(3)(4); var add3 = add(3); add3(4); 现在当调用 而 注意这里提到了将入参 3 保存 到了闭包中后续使用,很容易联想到 function.bind(thisArg[, arg1[, arg2[, ...]]]) 后面会看到,正因为 注意到 Currying 化的定义,其实是将多个参数打散到多个函数中,这个过程可通过代码来自动化,以达到将任意多入参函数进行 Currying 化的目的,后面讨论实现。 偏函数/Partial Application区别与 Currying,如果在拆分入参的过程中,这些拆分出来的函数不是一次只应用其中的一个,而是任意多个,则这些函数就是部分应用(Parital application)了原函数中的入参,称作偏函数。 考察下面的 function add(a, b, c, d) {
那么如下的函数就都是偏函数,它们都部分应用了 function partial1(a) {
偏函数中这种入参的拆分和部分应用,并不仅限于一层的拆分,可以是任意多次的: function partial1(a, b) {
其中, 可以看到,偏函数是 Curring 更加一般(general)的形式,下面看如何实现将任意函数进行 Currying 化,或偏函数化。 将一般化函数进行 Currying 化我们需要构造这么一个函数假设名叫 function curry(fn){
调用 function add (a, b) {
即上述 function currified (a) {
首先,通过 再加上前面提到的 function curry(f) {
下面测试一下: function add(a, b) {
并且以上实现不只是简单的 Currying 化,可以是任意数量和任意次数的 parial application: function add(a, b, c, d) {
总之就是各种形状和(hàn)姿势,各种颜色和(hàn)皮肤的组合。 自动化的 CurryIng 倒是实现了,可说了半天,它具体有什么实用价值。 函数的组合(function composition)我们知道代数里面可以有函数的组合,譬如:
上述代数表达转成 JavaScript 即: function f(x) {
这里用到了两个函数 像这样只接收一个入参并返回一个结果的函数,便符合组装的需求,可像上面这样自由组合。通过上面的讨论我们知道,任意函数都可经过 Currying 化处理后变成多个只接收单个入参的函数。这就为函数的组合提供了基础。 因此我们可以将 const compose = fn1 => fn2 => input => fn1(fn2(input)); 使用: const myFn = compose(f)(g); 像上面的 const pipe = (...fns) => input => fns.reduce((mem, fn) => fn(mem), input) const double = x => x 2 上面的 以上,函数的组装。 相关资源
|
Currying 及应用的更多相关文章
- 前端开发者进阶之函数柯里化Currying
穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接 ...
- 函数式中的 currying
currying 是函数式语言中经常遇到的一个概念,翻译成 柯里化,不是库里化. currying 指的是将接收多个参数的函数变换成接收一个单一参数,并且返回接收余下的参数而且返回结果的新函数的技术. ...
- 函数柯里化(Currying)示例
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...
- JavaScript中的Partial Application和Currying
这篇文章是一篇学习笔记,记录我在JS学习中的一个知识点及我对它的理解,知识点和技巧本身并不是我原创的.(引用或参考到的文章来源在文末) 先不解释Partial Application(偏函数应用)和C ...
- call, apply && bind, currying
简要概括: apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组 ——function.apply(thisobj, args) 或者 function.apply(thiso ...
- [Javascript] What is JavaScript Function Currying?
Currying is a core concept of functional programming and a useful tool for any developer's toolbelt. ...
- Function Currying in javascript 的一些注释
理解函数柯里化(Function Currying ),最关键的是理解下面这个函数: function curry(fn){ var args = Array.prototype.slice.call ...
- 浅析 JavaScript 中的 函数 currying 柯里化
原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- 函数式编程之-Currying
这个系列涉及到了F#这门语言,也许有的人觉得这样的语言遥不可及,的确我几乎花了2-3年的时间去了解他:也许有人觉得学习这样的冷门语言没有必要,我也赞同,那么我为什么要花时间去学习呢?作为一门在Tiob ...
随机推荐
- bzoj2049 Cave 洞穴勘测 lct
这里比上次多了几个操作. 1. make_root(u) 换根节点, 先access(u), 再splay(u),将u移动到splay树的最顶上, 现在这棵splay对于root来说 只有左子树上有东 ...
- lightoj 1158 - Anagram Division(记忆化搜索+状压)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1158 题解:这题看起来就像是记忆搜索,由于s很少最多就10位所以可以考虑用状压 ...
- CodeForces Round #514 (div2)
A:Cashier 题意:问可以休息多少次. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen( ...
- codeforces 591 E. Three States(bfs+思维)
题目链接:http://codeforces.com/contest/591/problem/E 题意:有3个数字表示3个城市,每种城市都是相互连通的,然后不同种的城市不一定联通,'.'表示可以建设道 ...
- java 面试题 1-10
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 1.一个".java&q ...
- Python(Head First)学习笔记:五
5 推导数据:处理数据.格式.编码.解码.排序 处理数据:从Head First Python 上下载资源文件,即:james.txt,julie.txt,mikey.txt,sarah.txt. 实 ...
- NOIP要炸?
今天起床,翻我的群,突然看见一条消息: “NOIP要被禁赛了!” 莫名奇妙啊...... 于是我就进去看了看,网上疯传,搞得跟真的一样,差点吓到我了. 但好在每个人心中都有一个阿Q,会精神胜利法,于是 ...
- 记一次oracle新建用户及分配指定表权限的操作记录
1.登录 2.创建用户create user new用户名 identified by new用户名创建new用户名用户,密码设置为new用户名. 3.授权new用户名用户的连接.资源权限.grant ...
- C#中使用StreamReader实现文本文件的读取与写入
场景 实现一个 TextReader,使其以一种特定的编码从字节流中读取字符. 关注公众号霸道的程序猿获取编程相关电子书.教程推送与免费下载. 大量编程视频教程:https://space.bilib ...
- 记一次往集群添加机器,liveNodes缺少机器的情况
1.背景 公司线下环境,原本有三台虚拟机组成的集群(cdh5.3.6),由于硬件配置比较低,申请了新的三台机器,8核8G内存,在上面部署了cdh5.11.1,较新的cdh集群. 由于远来的三台还在使用 ...