2013-01-25 55 views
4

我刚刚开始使用Groovy,来自Haskell,C++和一点Java的背景。Groovy关闭自动currying

可以说,我写像下面这样的封闭:

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)。无论如何要关闭这样的行为?

回答

5

你可以做这样的事情 “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