函数式编程之柯里化

1.柯里化可以把函数作为参数传递给另一个函数,可以实现闭包或者惰性计算;

1.首先请看最简单的例子:

// 普通的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
//换种写法
var dome=curryingAdd(2);
dome(1)//3
dome(3)//5
dome(1)(2)//报错
//思考:
//为什么会出现这样的现象?
//从闭包角度解释这一现象

2.上面的例子的柯里化,局限性很大,是根据函数功能单独写的,那如何写一个通用的柯里化函数

一. 函数式编程的特点就式可以用函数作为一个参数

二.从上面的例子可以看出用个变量的存储 返回出来的值 var dome=curryingAdd(2) 等于 function (y) {return 2 + y}

function cuury(fn, agrs) {
	//fn是cuury本身调用函数   agrs为回调参数  不为 外部调用使用  也就是说与fn无关
	var length = fn.length;
	var agrs = agrs || [];
	//var agrs=Array.prototype.slice.call(arguments,1)
	return function() {
		//这边做缓存 newAgrs  arguments为cuury调用函数的参数
		var newAgrs = agrs.concat(Array.prototype.slice.call(arguments));
		if(newAgrs.length < length) {
             //递归 将参数以及闭包下的fn 调用
			return cuury.call(this, fn, newAgrs)
		} else {
            //递归出口 并且执行函数
			return fn.apply(this, newAgrs)
		}
	}
}

function add(x, y , z) {
    return x + y + z;
}
var dome=cuury(add);
//dome 这边也就等于cuury返回的函数并且因为闭包 将 length,以及agrs的变量存储下来
dome(1)//f()...递归中
dome(2)//f()...递归中
dome(3)//6 递归出口  并执行函数

个人观点总结:柯里化 原理 利用函数闭包性质存储 参数 以及  return新的匿名函数  (它里面参数  就是调用函数的参数 )分开处理 然后延迟执行;

3. 扩展:

function curry(){
		  	var agrs=Array.prototype.slice.call(arguments);
		  	var fn=function(){
		  		var newargs=agrs.concat(Array.prototype.slice.call(arguments));
		  		display.apply(this,newargs)
		  	}
		  	fn.toString=function(){
		  		return agrs.reduce(function(a,b){
		  			return a+b;
		  		})
		  	}
		  	return fn;
}
curry(1) //f 1
curry(2) //f 3
curry(3) //f 6
//思考 为什么会有这样的结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值