函数柯里化
//函数柯里化//对于无限参数的函数柯里化
function add(...args){
return args.reduce((prev,current)=>{
return prev+current},0)
}
// console.log(add(1,2,3,4,5,6)
// )
function unlimitedCurry(fn){
const args=[]
return function process(...rest){
if(rest.length==0){
return fn(...args)
}else{
args.push(...rest)
return process
}
}
}
// console.log(unlimitedCurry(add)(1,2)(3,4)(5,6,7,8,9)())
// console.log(unlimitedCurry(add)(1,2,3)(4)())
// console.log(unlimitedCurry(add)(1)(2)(3)(4)())
//对于有限个参数的函数柯里化
function sum(x,y,z){
// console.log(this)
return x+y+z
}
function limitedCurry(fn){
return function curried(...args){
if(args.length>=fn.length) return fn.apply(this,args)
else{
// console.log("内部的",this)
return function curried2(...args2){
return curried.apply(this,args.concat(args2))
}
}
}
}
// console.log(limitedCurry(sum)(1,2,3))
// console.log(limitedCurry(sum)(1,2).apply({obj:'dada'},))
// console.log(limitedCurry(sum).apply({obj:'sasa'},)(1,2))
// console.log(limitedCurry(sum)(1)(2)(3))
// 对于有限个参数柯里化2
function makeCurry(fn,needs_args_count=fn.length){
return (function curryWrapper(process_args){
return function curried(...args){
let fact_args=[...process_args,...args]
if(fact_args.length>=needs_args_count){
return fn(...fact_args)
}else{
returncurryWrapper(fact_args)
}
}
})([])
}
// console.log(makeCurry(sum)(1)(2)(3))
// console.log(makeCurry(sum)(1,2)(3))
// console.log(makeCurry(sum)(1,2,3))
我的理解也不是很深,有错的地方,哥哥们可以指出来发表你们的意见 柯里化都没有听过 呜呜 王一之 发表于 2022-2-24 12:05
柯里化都没有听过 呜呜
换个说法
闭包返回函数,让函数记录上下文
我当初听看这名也一脸懵逼 嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。 王一之 发表于 2022-2-24 12:05
柯里化都没有听过 呜呜
js内置有一个bind函数就是很典型的函数柯里化的例子,简单来说就是不用传入所用参数,可以传入部分参数先生成一个函数再用那个生成的函数传入剩下的参数,结合组合函数与可以创造更多的东西,因为组合函数所需要的函数都是一个输入一个输出的,但很多函数可能是有多个参数一个输出,可以先通过函数柯里化先把这些参数进行绑定后,再传入剩下的一个参数就能和组合函数结合来使用了。 cxxjackie 发表于 2022-2-24 12:10
嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。 ...
谢谢大佬的建议,但习惯问题不好改,团队协作会用eslint来规范,但我自己写项目我基本都不装eslint cxxjackie 发表于 2022-2-24 12:10
嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。 ...
我不止这一个毛病...
我写代码自己都知道自己写的蜜汁脏乱...
但是下次写还是死脏死脏的 rubinTime 发表于 2022-2-24 12:48
谢谢大佬的建议,但习惯问题不好改,团队协作会用eslint来规范,但我自己写项目我基本都不装eslint ...
{:4_104:}我们公司因为部长不会用eslint
直接禁用eslint+ts了
大家一起写代码就是大杂炖
上次还有不知道哪个傻逼原生写疯了,他妈的拿vue操作dom写原生
李恒道 发表于 2022-2-24 14:34
我们公司因为部长不会用eslint
直接禁用eslint+ts了
大家一起写代码就是大杂炖
哈哈哈,ts目前也在学,泛型和类型体操都很难但是用起来很炫
页:
[1]
2