【问题标题】:Groovy closures with automatic currying带有自动柯里化的 Groovy 闭包
【发布时间】:2013-01-08 23:52:49
【问题描述】:

我刚刚开始使用 Groovy,具有 Haskell、C++ 和一点 Java 的背景。

假设我写了一个如下的闭包:

def mult = { x, y -> x * y }

以后我可以写mult(3,5)

但是如果我写mult(3),我会得到一个编译错误。

我当然可以写mult.curry(3),但这对我来说有点难看。

那么我可以试试这个方法:

def mult = { x -> { y -> x * y }}

现在,mult(3) 可以正常工作,但是要将两个数字相乘,我必须编写 mult(3)(5) 来将两个数字相乘。

我想要的是两全其美。我希望能够写mult(3)mult(3,5)mult(3)(5)。无论如何要让闭包表现得像这样?

【问题讨论】:

    标签: groovy currying


    【解决方案1】:

    你可以做这样的事情来“currify”你的闭包:

    def currify(fn) {
        { Object... args ->
            if (args.size() == fn.maximumNumberOfParameters) {
                fn(*args)
            } else {
                currify(fn.curry(*args))
            }
        }
    }
    
    def mult = currify { x, y -> x * y }
    def twice = mult(2)
    
    assert mult(2, 5) == 10
    assert twice(5) == 10
    assert mult(2)(5) == 10
    

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2021-03-11
      • 1970-01-01
      • 2011-07-01
      • 2019-11-18
      • 2011-05-26
      • 2016-01-01
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多