上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

函数柯里化

[复制链接]
  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-2-24 11:27:27 | 显示全部楼层 | 阅读模式
    //函数柯里化

    //对于无限参数的函数柯里化
    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'},[3]))
      // console.log(limitedCurry(sum).apply({obj:'sasa'},[3])(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{
                return  curryWrapper(fact_args)
             }

        }  
      })([])
    }
    // console.log(makeCurry(sum)(1)(2)(3))
    // console.log(makeCurry(sum)(1,2)(3))
    // console.log(makeCurry(sum)(1,2,3))



  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-2-24 11:29:05 | 显示全部楼层
    我的理解也不是很深,有错的地方,哥哥们可以指出来发表你们的意见
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-2-24 12:05:35 | 显示全部楼层
    柯里化都没有听过 呜呜
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2022-2-24 12:08:59 | 显示全部楼层
    王一之 发表于 2022-2-24 12:05
    柯里化都没有听过 呜呜

    换个说法
    闭包返回函数,让函数记录上下文
    我当初听看这名也一脸懵逼
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-2-24 12:10:40 | 显示全部楼层
    嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-2-24 12:14:39 | 显示全部楼层
    王一之 发表于 2022-2-24 12:05
    柯里化都没有听过 呜呜

    js内置有一个bind函数就是很典型的函数柯里化的例子,简单来说就是不用传入所用参数,可以传入部分参数先生成一个函数再用那个生成的函数传入剩下的参数,结合组合函数与可以创造更多的东西,因为组合函数所需要的函数都是一个输入一个输出的,但很多函数可能是有多个参数一个输出,可以先通过函数柯里化先把这些参数进行绑定后,再传入剩下的一个参数就能和组合函数结合来使用了。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-2-24 12:48:11 | 显示全部楼层
    cxxjackie 发表于 2022-2-24 12:10
    嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。 ...

    谢谢大佬的建议,但习惯问题不好改,团队协作会用eslint来规范,但我自己写项目我基本都不装eslint
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2022-2-24 14:09:01 | 显示全部楼层
    cxxjackie 发表于 2022-2-24 12:10
    嗯...说点题外话,你这个代码风格不是很好,老是不加空格读起来有点费劲(道哥也有这毛病哈哈)。 ...

    我不止这一个毛病...
    我写代码自己都知道自己写的蜜汁脏乱...
    但是下次写还是死脏死脏的
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2022-2-24 14:34:26 | 显示全部楼层
    rubinTime 发表于 2022-2-24 12:48
    谢谢大佬的建议,但习惯问题不好改,团队协作会用eslint来规范,但我自己写项目我基本都不装eslint ...

    我们公司因为部长不会用eslint
    直接禁用eslint+ts了
    大家一起写代码就是大杂炖
    上次还有不知道哪个傻逼原生写疯了,他妈的拿vue操作dom写原生

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-2-24 15:12:39 | 显示全部楼层
    李恒道 发表于 2022-2-24 14:34
    我们公司因为部长不会用eslint
    直接禁用eslint+ts了
    大家一起写代码就是大杂炖

    哈哈哈,ts目前也在学,泛型和类型体操都很难但是用起来很炫
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表