Groovy封口,自动卷边

时间:2013-01-25 03:00:53

标签: groovy currying

我刚开始使用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)。无论如何要让闭包表现得像这样?

1 个答案:

答案 0 :(得分:5)

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

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