2013-01-25 56 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