美文网首页
柯里化的介绍(Curried Closure)

柯里化的介绍(Curried Closure)

作者: 平飞兄 | 来源:发表于2015-01-24 13:57 被阅读0次

    柯里化是一个看起来比较费解的名字,特意到wiki上找了一下,这是它的定义:在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。
    不过我们可以通过简单的事例来轻易理解它。先一句话概括就是:先给闭包绑定一些参数,每次绑定之后,在绑定完成的对象看来,这个参数就是不需要传递的参数了,用户只需要传递剩余的参数过来就可以。
    示例如下:
    1、先定义一个函数,参数是一个闭包:

    def printFavorite(Closure closure){
       def curryobj = closure.curry("小明","浙江杭州",30)
       def rcurryobj = closure.rcurry("浙江-杭州",30,"大河恋")
       def ncurryobj = closure.ncurry(2,30).ncurry(1, "浙江杭州").ncurry(0, "小明")
       curryobj "战争与和平"
       curryobj "三国演义"
       curryobj "红与黑"
       curryobj "倾城之恋"
       rcurryobj "小明"
       ncurryobj "楚门的世界 "
    }
    

    2、接下来是闭包定义

    def bibao = {name,address,age,book->
            println "名字:$name  地址:$address   年龄:$age 书名:$book"
    }
    

    3、调用语句

    printFavorite(bibao)
    

    结果:

    名字:小明 地址:浙江杭州 年龄:30 书名:战争与和平
    名字:小明 地址:浙江杭州 年龄:30 书名:三国演义
    名字:小明 地址:浙江杭州 年龄:30 书名:红与黑
    名字:小明 地址:浙江杭州 年龄:30 书名:倾城之恋
    名字:小明 地址:浙江-杭州 年龄:30 书名:大河恋
    名字:小明 地址:浙江杭州 年龄:30 书名:楚门的世界

    总结下:闭包调用curry方法之后,可以按照顺序来绑定参数,获得一个柯里化对象,之后调用这个柯里化对象就可以不用传入这个参数了。细心的同学应该还可以看到,这里groovy还提供了倒序柯里化的方法rcurry,以及指定位置柯里化的ncurry方法,只要跑几个例子就可以明白,不在赘述了。

    相关文章

      网友评论

          本文标题:柯里化的介绍(Curried Closure)

          本文链接:https://www.haomeiwen.com/subject/bcdztttx.html